JNI için çok yeni ve C++ iOS kodumu kullanmadan önce bazı şeylerin nasıl çalıştığını anlamaya çalışıyorum. Android stüdyosunda çalışan NDK örneklerinden birini elde etmede başarılı oldum ve Java'nın C++ işlevlerini nasıl arayabildiğini görebiliyorum.Android NDK: Java işlevlerini çağırma C++
Çevresinde arama yaptım ve kod parçalarını alıyorum, ancak özel uygulamada çalışmaya başlayamadım.
Sadece işlerin nasıl çalıştığını test etmek için java'da basit bir metin günlüğü işlevi oluşturuyorum ve bunu yerel kodumdan aramaya çalışıyorum ancak sorunlara yanıt veriyorum. Bunun çalışması gerekir farklı örneklerle gördüklerime
void Log(std::string s){
JNIEnv *env;
g_JavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);
jstring jstr1 = env->NewStringUTF(s.c_str());
jclass clazz = env->FindClass("com/android/gl2jni/GL2JNILib");
jmethodID mid = env->GetStaticMethodID(clazz, "log", "(Ljava/lang/String;)V");
jobject obj = env->CallStaticObjectMethod(clazz, mid, jstr1);
}
, ancak bir hata atar:
public static void log(String s){
Log.d("Native", s);
}
Ve C++: Burada
benim Java fonksiyonudur29835-29849/com.android.gl2jni A/libc﹕ Fatal signal 11 (SIGSEGV) at 0x00000000 (code=1), thread 29849 (Thread-17371)
Bir şey mi eksik?
DÜZENLEME:
Ben GetStaticMethodID bunu değiştirdik. Ama fonksiyonun ilerleme giriş yaptıktan sonra ben başarısız hat olduğunu öğrendim: g_JavaVM static JavaVM* g_JavaVM = NULL;
olarak ayarlayın ve sonra tekrar dokunmadık çünkü ben anlamaya
g_JavaVM->GetEnv((void**)&env, JNI_VERSION_1_6);
olduğunu. Sanırım bu değişkeni ayarlamam gerekiyor, ama nasıl?
Her satırdan önce __android_log_print (ANDROID_LOG_DEBUG, "myApp", "msg xxx") ekleyebilir ve hangisinin SIGSEGV'ye yol açtığını öğrenebilirsiniz. –
Kodu test etmedim, ancak 'JNIEnv'de bir' GetStaticMethodID' işlevi olduğundan, 'GetMethodID' çağrınızın imzanızla eşleşen herhangi bir statik olmayan yöntem bulamadığını ve sonra döndürdüğünü tahmin ediyorum null, kontrol edemediğin. – zenzelezz
Bazı kodları değiştirdim ve bazı ayrıntıları ekledim. – Bananable