我正在使用JNI从安卓系统调用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:我知道这里有几个关于这个话题的帖子,但我无论如何都不能让它工作。一定有什么东西我只是错过了,我只是不能弄清楚是什么。
发布于 2012-02-24 17:27:07
可以尝试使用:(*env)->GetObjectClass(env, obj);
而不是FindClass
吗
发布于 2012-02-24 17:18:19
您已经在c++中创建了一个空字符串,并从方法中传递了来自java的空字符串
jString pSrc = (*env)->GetString(env,source, 0);
//这里的source是u从java方法传递的空字符串,现在u将字符串复制到source中
(*env)->String(env, source, pSrc , 0);
以及最终的用途
(*env)->ReleaseString(env,source, pSrc , 0);
https://stackoverflow.com/questions/9428001
复制相似问题