Вызов функции Java из C++ на Android через JNI
Я звоню C++ из Android с JNI, и пока это работает. Теперь мне нужно, чтобы в этой функции C++ была функциональность из Java и попытался перезвонить в Java из C++. Я проверил различные решения на stackru и других источниках в сети, но я почему-то просто не мог заставить его работать.
Я всегда получаю следующее исключениеW/dalvikvm(358): JNI WARNING: can't call Lcom/main/Main;.message on instance of Lcom/main/Main;
"
Кто-нибудь может дать мне какой-нибудь совет по этому поводу? Я что-то пропустил, что-то наблюдал или просто ошибся кодом?
Вот часть Java, которую я хочу вызвать из C++:
public class Main extends Activity
{
public native String JNIInit();
String message(String text)
{ text = text + "from java";
return text;
}
.
.
}
Это функция C++, которую я могу успешно вызвать из Java, но из которой я не могу перезвонить в 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: я знаю, что здесь есть несколько тем на эту тему, но я все равно не смог заставить его работать. Там должно быть что-то, что я просто скучаю, и я просто не могу понять, что это такое.
2 ответа
Вместо того, чтобы использовать FindClass
Можете ли вы попробовать использовать: (*env)->GetObjectClass(env, obj);
Вы используете создать пустую строку в C++, а также передать пустую строку из Java из метода
jString pSrc = (*env)->GetString(env,source, 0);
// Здесь source - пустая строка, которую вы передаете из метода java, теперь вы копируете строку в источник
(*env)->String(env, source, pSrc , 0);
и в конце концов использовать
(*env)->ReleaseString(env,source, pSrc , 0);