我使用JNI 从Android调用 C ++,到目前为止它的工作原理。现在我需要在C ++函数中使用Java的一些功能,并尝试从C ++回调Java。我在网上检查了stackoverflow和其他来源的各种解决方案,但我不知何故无法让它工作。
我总是得到以下例外“W/dalvikvm(358): JNI WARNING: can't call Lcom/main/Main;.message on instance of Lcom/main/Main;
”
有人可以就此提出任何建议吗?我是否错过了什么,监督某些事情或者只是错误的代码?
以下是我想从C ++调用的Java部分:
public class Main extends Activity
{
public native String JNIInit();
String message(String text)
{ text = text + "from java";
return text;
}
.
.
}
这是我可以从Java成功调用的 C ++ 函数,但是我无法回调Java:
extern "C" JNIEXPORT jstring JNICALL Java_com_main_Main_JNIInit(JNIEnv* env, jobject obj)
{ jstring jstr = env->NewStringUTF("From jni");
jclass cls = env->FindClass("com/main/Main");
jmethodID method = env->GetMethodID(cls, "message", "(Ljava/lang/String;)Ljava/lang/String;");
jobject result = env->CallObjectMethod(obj, method, jstr);
return env->NewStringUTF(str);
}
PS:我知道这个主题有几个主题,但无论如何我都无法正常工作。必须有一些我错过的东西,而我根本无法弄清楚那是什么。
答案 0 :(得分:2)
您可以尝试使用FindClass
(*env)->GetObjectClass(env, obj);
答案 1 :(得分:-1)
jString pSrc = (*env)->GetString(env,source, 0);
//这里的source是你从java方法传递的空字符串 现在你将字符串复制到源
(*env)->String(env, source, pSrc , 0);
并最终使用
(*env)->ReleaseString(env,source, pSrc , 0);