gpt4 book ai didi

callback - 如何创建静态 JNI 环境指针?

转载 作者:行者123 更新时间:2023-12-04 02:38:12 24 4
gpt4 key购买 nike

在这里,我在 JAVA 中创建了一个类,其中有我必须从 C 文件调用的函数(回调)。

class DSMInitializeClassParameter {

/**
* Callback function for DSM Initialize.
*/
public void DSMInitializeCallback( ) {

// Write Message To Logs.
System.out.println( "Dsm Initialize Callback called." );
}
}

为此,我创建了必须调用的 native 方法。
public class DsmLibraryTest extends Activity {
// Some code ....

// Create a DSMInitializeClassParameter class object.
DSMInitializeClassParameter object = new DSMInitializeClassParameter();
// Call native method with given object.
nativeMethod( object );

// Some code ....

// Implementation of native method.
public native int nativeMethod(DSMInitializeClassParameter classObject);
}

C 文件我有以下内容:
dsmResult_t dsmInitializeCall( dsmResult_t status, void * pUserData, dsmEvent_t * hEvent ) {

(*env)->CallVoidMethod(env, classObject, mid);
}

JNIEXPORT jint JNICALL Java_com_Dsm_Test_DsmLibraryTest_nativeMethod(JNIEnv* env, jobject obj, jobject classObject) {
// This function loads a locally-defined class. It searches the directories and zip
// files specified by the CLASSPATH environment variable for the class with the specified name.
jclass cls = (*env)->FindClass( env, "com/Dsm/Test/DSMInitializeClassParameter" );
// Get java Method.
jmethodID mid = (*env)->GetMethodID(env, cls, "DSMInitializeCallback", "()V");
// If no method was found return -1;
if( mid == NULL ) {
return -1;
}

// Call DSM Initialize Callback Function and return value.
return dsmInitialize( dsmInitializeCall, NULL );
}

你怎么看我要打电话 (*env)->CallVoidMethod(env, classObject, mid);来自 dsmInitializeCall函数,但是如果我没有 env 我怎么能调用它, classObjectmid我尝试使用静态,但它不起作用。

最佳答案

一般是unsafe缓存 JNIEnv*实例并继续使用它,因为它根据当前事件的线程而变化。您可以保存一个 JavaVM*永远不会改变的实例。在原生初始化函数中,调用 GetJavaVM并将 JavaVM 的地址传递给它指针:

static JavaVM *jvm;
JNIEXPORT void JNICALL Java_SomeClass_init(JNIEnv *env, jclass) {
int status = (*env)->GetJavaVM(env, &jvm);
if(status != 0) {
// Fail!
}
}

现在您可以使用该 JavaVM*获取当前 JNIEnv* AttachCurrentThread :
dsmResult_t dsmInitializeCall( dsmResult_t status, void * pUserData, dsmEvent_t * hEvent ) {
JNIEnv *env;
(*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
(*env)->CallVoidMethod(env, classObject, mid);
}

关于callback - 如何创建静态 JNI 环境指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6202621/

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