gpt4 book ai didi

java - 从 native 库回调到JNI接口(interface)

转载 作者:太空宇宙 更新时间:2023-11-04 04:11:28 24 4
gpt4 key购买 nike

如何将函数从本机库调用到JNI接口,如何将函数从JNI接口调用到JAVA?有可能吗?我该怎么做?
下面是JNI接口(假设)

JNIEXPORT void JNICALL Java_com_example_test_mode_calltoJava(
JNIEnv *env,
jobject /* this */) {

/*Call to Java Function */
}

下面是C库函数(假设)
void test(int a,int b){
Call to JNI Interface
//Java_com_example_test_mode_calltoJava(a,b)
}

注意:我的框架是这样的:[C Library]<-->[JNI Interface]<-->[JAVA],我需要从JNI Interface在C Library中注册一个回调,然后当C Library中发生适当的事件时,注册的回调应该调用JAVA函数。

最佳答案

相反的方向。
Java_com_example_test_mode_callToJava的声明是一个本机C函数。所以实际上你在某处声明了一个native void callToJava();,并调用了javac -h。你得到了这个函数声明。
此函数是本机函数,可以从Java调用。
尽管如此,这里还是有一个示例,其中正是从本机函数调用Java方法的声明。
当然应该用不同的名字命名。但是这里有一个实现,它在本机C端看起来是什么样子的。在这里,我们将回调一个名为test的Java方法。

JNIEXPORT void JNICALL Java_com_example_test_mode_callToJava(JNIEnv *jenv, jobject jobj) {    
jclass cls = (*jenv)->GetObjectClass(jenv, jobj);
jmethodID mid = (*jenv)->GetMethodID(jenv, cls, "test", "(II)V");

jint a = 42;
jint b = 4711;
(*jenv)->CallVoidMethod(jenv, jobj, mid, a, b);
}

你可以这样从Java调用它:
mode m = new mode();
m.callToJava();

别忘了声明:
native void callToJava();

所以上面的这个本地C函数调用一个Java函数。它被命名为test。
Java方法可能如下所示:
void test(int a, int b) {
System.out.println("a=" + a + " b=" + b);

到控制台的输出将是:
a=42 b=4711

关于java - 从 native 库回调到JNI接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56783864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com