JNI编程——手工注册 native methods

来源:互联网 发布:招工网源码 编辑:程序博客网 时间:2024/06/08 07:40

java 程序调用 native methods 之前,有2个步骤:

1、System.loadLibrary("foo"); 定位和加载 libfoo.so(在Windows 上是 foo.dll)

2、 java虚拟机在所有已加载的共享库中,查找native methods 的implementation

(例如,java中 Foo类的 g() native method,java vm 会自动查找名为 Java_Foo_g的函数)


上面第2步,程序员可以代替虚拟机,手动来链接native methods 到它的 implementation。

方法:

    注册一个function pointer到一个class referenec,method name 和 method descriptor。

    例如:

       (在C/C++中):

         JNINativeMethod nm;

         nm.name = "g";

         nm.signature = "()V";

         nm.fnPtr = g_impl;

         (*env)->RegisterNatives(env, cls, &nm, 1);

// 原型:  void JNICALL g_impl_(JNIEnv* env, jobject self);

// 因为是使用函数指针,所以不需要export,因此不用加 JNIEXPORT。但是仍然需要加 JNICALL。


手工注册 native methods 的好处:

1、在早期注册,后面调用的时候效率会高一些

2、可以临时修改native methods,从而链接到另外一个native methods implementation

3、如果你写的程序是把java vm嵌入到自己的程序,那么这个方法会很有用(虚拟机不会从程序自身寻找native methods implementation, 只会从它加载的共享库中寻找)


原创粉丝点击