2015-02-20 10 views
5

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 fonksiyonudur

29835-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?

+0

Her satırdan önce __android_log_print (ANDROID_LOG_DEBUG, "myApp", "msg xxx") ekleyebilir ve hangisinin SIGSEGV'ye yol açtığını öğrenebilirsiniz. –

+0

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

+0

Bazı kodları değiştirdim ve bazı ayrıntıları ekledim. – Bananable

cevap

7

Sorunumun bir kısmı, JavaVM'yi başlatmadım. Diğer kısmı C++ kullanıyordum, ama C işlevlerini kullanmaya çalışıyordum.

çalışma kodudur:

Java:

public static void log(String s){ 
     Log.d("Native", s); 
} 

C++:

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); 
} 

//In some initialization function with Environment variable 

env->GetJavaVM(&g_JavaVM); 

Umarım bu aynı sorunu başka insanlara yardım edebilir.

+2

Yazım hatası var, CallStaticVoidMethod() 'olmalıdır. – Pol

+0

Javac Foo.java'yı kullandım ve ardından javap -s Foo ile karışık bir isim elde ettim. Http://www.rgagnon.com/javadetails/java-0286.html sayfasına bakın. – Glenn