在Solaris上实现了JNI之后,我就开始将目光放在更深的地方。我决定在Solaris系统上实现用JNI调用Tuxedo服务。
一般Java调用Tuxedo服务常用的方法有两种,一种是通过Jolt调用,一种是通过Weblogic的WTC调用。但是由于要模拟C++/C的调用,我不想用这两种方法。而是要用JNI的方式去调用Tuxedo服务。
由于这种“不走寻常路”这个过程中遇到了一些问题。
我在网上搜索了一下,没有找到太多有价值的东西,经过自己的研究,将我的一些经验记录下来。
一般Java调用Tuxedo服务常用的方法有两种,一种是通过Jolt调用,一种是通过Weblogic的WTC调用。但是由于要模拟C++/C的调用,我不想用这两种方法。而是要用JNI的方式去调用Tuxedo服务。
由于这种“不走寻常路”这个过程中遇到了一些问题。
我在网上搜索了一下,没有找到太多有价值的东西,经过自己的研究,将我的一些经验记录下来。
平时在使用Java的时候,有时候会用到JNI。但是使用JNI往往都只是在Windows上进行,很少有在其它系统上进行的。公司开发环境是Solaris,而且有Java环境。于是我就想在Solaris系统上使用JNI。
查了很多资料,发现Windows上的JNI和Unix系统上的JNI很多都一样。无非是写Java程序,编译Java,再用Javah得到一个.h文件,之后可以根据得到的.h文件编写c或c++程序了。这些步骤之后,不同系统的差别就体现出来了。虽然编译动态库的工作原理是一样的,但是每一个系统实实在在有着不小的差别。
在Windows上只要用vc编译出一个dll文件就可以了,之后就是将这个dll文件放在java执行目录下就可以调用。但是Unix系统的规则和Windows不同,它不会搜索当前目录。它会在LD_LIBRARY_PATH中设置的路径中找,而一般的系统中不会让LD_LIBRARY_PATH有当前的目录。这样就要修改配置文件,由于这个环境是很多人用的,不想改变配置,这样就需要每一次运行时用export设置一次LD_LIBRARY_PATH。这样很麻烦。于是我没有用常用的System.loadLibrary方法,而是用System.load方法,这个方法只要给出库文件的绝对路径就可以加载。
我遇到的另外一个问题是文件名的问题。在Solaris下,库文件之前要加"lib"比如"System.loadLibrary("Sample");",对应的库文件名就是libSample.so。这个问题也是困扰了半天的问题。
别外贴一个我编译so用到的指令以供后面学习参考。
查了很多资料,发现Windows上的JNI和Unix系统上的JNI很多都一样。无非是写Java程序,编译Java,再用Javah得到一个.h文件,之后可以根据得到的.h文件编写c或c++程序了。这些步骤之后,不同系统的差别就体现出来了。虽然编译动态库的工作原理是一样的,但是每一个系统实实在在有着不小的差别。
在Windows上只要用vc编译出一个dll文件就可以了,之后就是将这个dll文件放在java执行目录下就可以调用。但是Unix系统的规则和Windows不同,它不会搜索当前目录。它会在LD_LIBRARY_PATH中设置的路径中找,而一般的系统中不会让LD_LIBRARY_PATH有当前的目录。这样就要修改配置文件,由于这个环境是很多人用的,不想改变配置,这样就需要每一次运行时用export设置一次LD_LIBRARY_PATH。这样很麻烦。于是我没有用常用的System.loadLibrary方法,而是用System.load方法,这个方法只要给出库文件的绝对路径就可以加载。
我遇到的另外一个问题是文件名的问题。在Solaris下,库文件之前要加"lib"比如"System.loadLibrary("Sample");",对应的库文件名就是libSample.so。这个问题也是困扰了半天的问题。
别外贴一个我编译so用到的指令以供后面学习参考。
gcc -fpic -c -I/usr/java/include -I/usr/java/include/solaris Sample1.c
gcc -G -o libSample1.so Sample1.o
gcc -G -o libSample1.so Sample1.o



