gpt4 book ai didi

java - 从 C 调用 Java

转载 作者:太空宇宙 更新时间:2023-11-03 23:34:54 25 4
gpt4 key购买 nike

我是 JNI 和 Android NDK 的新手,我想从我的一个 C 语言线程调用 Java API。调用 Java 方法时出现错误:

谁能指导我,从 C 线程调用 Java 方法的最佳方法是什么?

下面的代码给我,无效的 JNI 引用错误

JavaVM *m_vm;
jobject obj;

JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
m_vm = vm;
return JNI_VERSION_1_4;

}


int aWorkerThread() {
JNIEnv *env;
jmethodID mid;

(*m_vm)->GetEnv(m_vm, (void**) &env, JNI_VERSION_1_4);
(*m_vm)->AttachCurrentThread(m_vm, &env, NULL);

jclass cls = (*env)->GetObjectClass(env, obj)
jmethodID mid = (*env)->GetMethodID(env, cls, "callbackfromNative", "(Ljava/lang/String;)V");

if (mid == NULL) {
return -1; // method not found
}

const char *pchar = "Hello From C layer";
jstring jStr = NULL;
jStr = (*env)->NewStringUTF(env, pchar);
(*env)->CallVoidMethod(env, obj, mid,jStr);

return 0;
}

将 obj 设置为全局变量

void Java_com_my_demo_init(JNIEnv * env, jobject this, jstring logThis)  
{
int nErrorCode;
jboolean isCopy;
const char * szLogThis = (*env)->GetStringUTFChars(env, logThis, &isCopy);
__android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "FromJava: [%s]", szLogThis);

obj = this; /*Lets assign obj here*/

/*Some other c code here..*/

(*env)->ReleaseStringUTFChars(env, logThis, szLogThis);
}

错误信息:

06-20 13:12:03.239: WARN/dalvikvm(753): JNI WARNING: 0x44e83338 is not a valid JNI reference
06-20 13:12:03.239: WARN/dalvikvm(753): in Ldalvik/system/NativeStart;.run ()V (GetObjectClass)

...
06-20 13:12:03.279: ERROR/dalvikvm(753): VM aborting

最佳答案

您已经获得了对象类 (cls) 和类方法 (mid),但您实际上并没有该对象的实例。这就像拥有一个空对象并试图调用它的方法之一。您需要使用 JNI 调用 AllocObject 设置 obj或 NewObject ,这就像在对象上执行"new"Java 运算符。 AllocObject 与 NewObject 的不同之处在于不调用对象的构造函数。

关于java - 从 C 调用 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6414768/

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