无需致电System.load 或System.loadLibrary。您可以使用不同的方式注册本机代码。
默认情况下,您可以通过构建共享库并加载它来导出JNI 符号,但也可以执行其他操作。
假设您有通过创建 JVM 调用 Java 代码的本机代码 (C)。反过来,Java 代码调用本机代码。
Java
package recipeNo052;
public class Main {
public static native int addOne(int a);
public static void displayMessage() {
System.out.println("Hello from Java");
System.out.println(
"I am calling method without System.load: " + Main.addOne(1));
}
}
现在,假设在您的 C 代码中,您有类似这样的内容(请注意,本机函数具有“正常”名称 - 没有基于 JNI 的前缀等)
C
JNIEXPORT jint JNICALL addOne(JNIEnv *env, jclass obj, jint a) {
return a + 1;
}
一旦你创建了你的JVM,你就可以做这样的事情
JNI_CreateJavaVM (&jvm, (void **) &env, &vm_args);
....
....
static JNINativeMethod methods[] = {
{"addOne", "(I)I", (void *)&addOne}
};
...
...
jclass cls_Main = (*env)->FindClass (env, "recipeNo052/Main");
...
...
(*env)->RegisterNatives(
env,
cls_Main,
methods,
sizeof(methods)/sizeof(methods[0]));
...
...
现在,每当您调用 Main.addOne 时,您实际上是从您的 main 代码调用 addOne 函数。
示例代码
> git clone https://github.com/mkowsiak/jnicookbook.git
> cd jnicookbook/recipeNo052
> make all
> make test
> make clean
你应该得到这样的东西
> make test
lib/recipeNo052_main
Hello from Java
I am calling method without System.load: 2
你可以在这里找到 repo:https://github.com/mkowsiak/jnicookbook.git