在 Linux 平台下使用 JNI(2)

参数:utf UTF 编码的字符串指针 对于数值型参数,在 C/C++ 中可直接使用,其字节宽度如下所示:

Java   C/C++   字节数  
boolean   jboolean   1  
byte   jbyte   1  
char   jchar   2  
short   jshort   2  
int   jint   4  
long   jlong   8  
float   jfloat   4  
double   jdouble   8  

对于数组型参数,

Java   C/C++  
boolean[ ]   JbooleanArray  
byte[ ]   JbyteArray  
char[ ]   JcharArray  
short[ ]   JshortArray  
int[ ]   JintArray  
long[ ]   JlongArray  
float[ ]   JfloatArray  
double[ ]   JdoubleArray  

对于上述类型数组,有一组函数与其对应。以下函数中 Xxx 为对应类型。
xxx * GetXxxArrayElements(xxxArray array, jboolean *isCopy)
产生一个指向 Java 数组元素的 C 指针。不再需要时,需将此指针传给 ReleaseXxxArrayElemes。

参数:array 数组对象 isCopy 如果进行拷贝,指向以 JNI_TRUE 填充的 jboolean, 否则指向以 JNI_FALSE 填充的 jboolean。 例如: jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy) void ReleaseXxxArrayElements(xxxArray array,xxx *elems, jint mode) 通知虚拟机不再需要从 GetXxxArrayElements 得到的指针。 参数:array 数组对象 elems 不再需要的指向数组元素的指针 mode 0 =在更新数组元素后释放 elems 缓冲器 JNI_COMMIT =在更新数组元素后不释放 elems 缓冲器 JNI_ABORT =不更新数组元素释放 elems 缓冲器 例如:void ReleaseBooleanArrayElements(jbooleanArray array,jboolean *elems, jint mode) xxxArray NewXxxArray(jsize len) 产生一个新的数组,通常在反值类型为数组型时用到 参数:len 数组中元素的个数。 例如:jbooleanArray NewBooleanArray(jsize len)

3 .编译生成共享库。

使用 GCC 时 , 必须通知编译器在何处查找此 Java 本地方法的支持文件,并且显式通知编译器生成位置无关的代码,在我的环境中按如下过程编译:

gcc -I/home/jbuilder/jdk1.3.1/include -I/home/jbuilder/jdk1.3.1/include/linux -fPIC -c Hello.c  

生成 Hello.o

gcc -shared -Wl,-soname,libhello.so.1 -o libhello.so.1.0 Hello.o  

生成libhello.so.1.0

接下来将生成的共享库拷贝为标准文件名

cp libhello.so.1.0 libhello.so

最后通知动态链接程序此共享文件的路径。

export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH

4 .编写一个简单的 Java 程序来测试我们的本地方法。

将如下源码存为 ToSay.java:

import Hello; import java.util.*; public class ToSay { public static void main(String argv[]) { ToSay say = new ToSay(); } public ToSay() { Hello h = new Hello(); // 调用本地方法向 John 问好 h.SayHello("John"); } }  

用 javac 编译 ToSay.java,生成 ToSay.class
向执行普通 Java 程序一样使用 java ToSay,我们会看到在屏幕上出现 Hello,John。
到这里我们就将整个的本地调用编写过程大概浏览了一遍。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/938532d0ace87bacd1be3b6f301e6a45.html