Некоторое время я пытался вызвать java-метод из C++, я могу успешно сделать это с классом Activity, но с NativeActivity он вылетает при вызове CallVoidMethod. GetMethodID может его найти, он возвращает адрес. Объекты env и vm действительны и заполняются из android_main (). Возможно ли, что он просто не будет работать с собственным классом активности?
Cpp: (отредактировано)
void SendNotification() {
JavaVM* lJavaVM = main_activity->vm;
JNIEnv* lJNIEnv = main_activity->env;
JavaVMAttachArgs lJavaVMAttachArgs;
lJavaVMAttachArgs.version = JNI_VERSION_1_6;
lJavaVMAttachArgs.name = "NativeThread";
lJavaVMAttachArgs.group = NULL;
jint lResult = lJavaVM->AttachCurrentThread(&lJNIEnv, &lJavaVMAttachArgs);
if (lResult == JNI_ERR)
return;
jobject lNativeActivity = main_activity->clazz;
jclass ClassNativeActivity = lJNIEnv->GetObjectClass(main_activity->clazz);
jmethodID _method = lJNIEnv->GetMethodID(ClassNativeActivity, "SendNotification", "()V");
lJNIEnv->CallVoidMethod(lNativeActivity, _method);
lJavaVM->DetachCurrentThread();
}
Ява:
package com.thor.kalen;
import android.app.AlertDialog;
import android.app.NativeActivity;
import android.os.Bundle;
public class MainActivity extends NativeActivity
{
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
} // End of public void onCreate(Bundle savedInstanceState)
public void SendNotification() {
new AlertDialog.Builder(this).setTitle("Alert").setMessage("").setNeutralButton("Close", null).show();
}
}




com.thor.kalen.MainActivity.SendNotification () Java-метод должен вызываться для задание класса com.thor.kalen.MainActivity, а не для jclass этого объекта: это не метод статический:
main_activity->env->CallVoidMethod(main_activity.clazz, _method)
Обратите внимание на комментарий в native_activity.h:
/** * The NativeActivity object handle. * * IMPORTANT NOTE: This member is mis-named. It should really be named * 'activity' instead of 'clazz', since it's a reference to the * NativeActivity instance created by the system for you. * * We unfortunately cannot change this without breaking NDK * source-compatibility. */ jobject clazz;
Кроме того, вы можете только показывать() AlertDialog из основного (UI) потока. Ваш код C++ предполагает, что вы делаете это из фонового потока.
Если этот код выполняется в основном потоке, то
main_activity->vm->DetachCurrentThread()
следует удалить. AttachThread () тоже можно удалить, но это NOP при вызове в уже присоединенном потоке.
Кроме того, я звоню из android_main.
Ты прав! Я перепутал объект и класс, теперь он работает, большое вам спасибо!
Я попытался заменить диалоговое окно предупреждения на int x = 0; и он все еще вылетает, похоже, даже не доходит.