Liunx java-eclipse下C++的so库的调用(下)

前面对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文件

Liunx java-eclipse下C++的so库的调用(下)_第1张图片

 

有了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时,报错:

Liunx java-eclipse下C++的so库的调用(下)_第2张图片

 

编译后产生两个.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对应的路径下也一样可以找到。

Liunx java-eclipse下C++的so库的调用(下)_第3张图片

由于打包版本和运行版本不对导致

 

由于我的WIN平台和虚拟机LINUX平台上的JDK不同,所以一直都没有测试成功。请读者自行验证了。

 

最后:总结几点。

打包时一定要注意使用的JDK,版本。运行环境版本要与打包版本一至,不然加载就会失败。(个人理解的,未得到验证)

其次,就是路径,环境变量需要设置好,否则就出现找不到库等问题。

再次,如果是打C++的SO库,在类型上都需要做一些必要的转换。这个只是个初步介绍,在实际项目中,会碰到各种问题,哪时再自行GOOGLE了。

 

OK,完毕。

 

 

 

 

你可能感兴趣的:(Liunx java-eclipse下C++的so库的调用(下))