参数: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。
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。
到这里我们就将整个的本地调用编写过程大概浏览了一遍。