前面对LINUX下打SO库进行了介绍。
这一章,将对WIN平台上编译C++打包SO库进行介绍,其实这个和LINUX下一样的操作,为什么要对WIN平台的介绍,是因为我在WIN平台打包碰到了问题,其次是我未使用过LINUX系统,习惯了WIN平台。好,不说废话了。
WIN32平台:
准备工作(版本可自选):
XP + JDK1.6
cygwin 最新版装:ubunit,g++,gcc,gdb (其中g++,gcc已升到4.5.3版,默认装好的是3.4.4)
swig :2.0.4
其中的.h和.cpp及.i文件请见上集中的interfacecar.h和interfacecar.cpp和cplus.i文件。
将以上文件放到同一个目录下,这个目录最好不要使用带空格的及中文的路径目录。如果有中文的可以使用subst来进行映射成其它盘符(嘿嘿通常我都这么搞)。
或都使用\来将空格进行转议如/cygdrive/c/program\ files/.... 中间的空格就使用\来转议
准备工作OK。
1、使用SWIG将.i文件编译为JAVA文件。(我的文件路径:f:\so\socplus)
[如果未设置环境变量的,必须先cd进入到swig目录]
swig -c++ -java f:\so\socplus\cplus.i
将产生.java和xxx_wrap.cxx文件
有了xxxx_wrap.cxx文件,就可以打SO库了。
2、先把.cpp和cxx文件编译为.o文件。
先cd进入到相应的目录,注cygwin的目录需要使用/cygdrive/进行映射
g++ -Wall -c interfacecar.cpp cplus_wrap.cxx
说明:
这命令是不是像LINUX下的呀,有些人对比了一下,怎么没有连接jni.h和jni_md.h头文件啊。原因是因为我的JDK装在了D:\program files\java下了,大家注意这个program files这个目录中有一个空格如果使用-I/cygdrive/d/program files/java/...时会提示找不到files/java/....明白为什么不用空格路径的原因了吧。嘿嘿,不要紧张,还是有解决办法的。到Cygwin目录搜一下jni.h和jni_md.h,把你的JDK中的jni.h和jni_md.h考过来替换即可解决(为什么要替换是因为我的Swig 导出的xxx_wrap.cxx用的是JDK1.6而我的cygwin中自带的jni不是这个版本的,所以冲突)。
找不到jni或版本不对的jni.h时,报错:
编译后产生两个.o文件;
3、将.o文件打包为so库文件。
g++ -shared -fpic interfacecar.o cplus_wrap.o -o libcp.so
这个跟LINUX命令没有什么区别,一样的。
OK,打包完成。
以上为WIN平台打包完成。
测试:
将.so和.JAVA文件全部丢到LINUX平台下进行测试。(好像也可以将JAVA文件编译为CLASS文件打个Jar,jar cvf xxx.jar *.class)这个JAVA的自行研究了。
有几个错:
java.lang.UnstaisfiedLinkError:no cp in java.library.path
这是找不到libcp.so这个库。我只知道放到/usr/lib下可以找到,当然对eclipse的高手可以设置搜索路径到libcp.so对应的路径下也一样可以找到。
由于打包版本和运行版本不对导致
由于我的WIN平台和虚拟机LINUX平台上的JDK不同,所以一直都没有测试成功。请读者自行验证了。
最后:总结几点。
打包时一定要注意使用的JDK,版本。运行环境版本要与打包版本一至,不然加载就会失败。(个人理解的,未得到验证)
其次,就是路径,环境变量需要设置好,否则就出现找不到库等问题。
再次,如果是打C++的SO库,在类型上都需要做一些必要的转换。这个只是个初步介绍,在实际项目中,会碰到各种问题,哪时再自行GOOGLE了。
OK,完毕。