2010-10-27 19 views
19

NDK kitaplığı ve ilgili Java sınıfı ile ilgili bir çalışma uygulamam var. Ancak bu sınıfa aşırı yüklenen yöntemi ekleyemiyorum. Şu anda benim sınıf içerir:Android NDK'da yerel yöntem imzaları yazmanın doğru yolu nedir?

package com.package; 

public class MyClass 
{ 
    public static native String getFileName(); 
    static 
    { 
    System.loadLibrary("mylib"); 
    } 
} 

Benim jniwrappers.cpp dosyası aşağıdaki bildiriyi sahiptir:

JNIEXPORT jstring JNICALL 
Java_com_package_MyClass_getFileName(_JNIEnv* env, jobject thiz); 

bu nokta her şeyi kadar çalışıyor cezası. Ama gelecek benim sınıf değiştirin:

package com.package; 

public class MyClass 
{ 
    public static native String getFileName(); 
    public static native String getFileName(int index); 
    ... 
} 

Ve başka beyanı jniwrappers.cpp eklemek: Bu ince, Android uygulama başlar derler

JNIEXPORT jstring JNICALL 
Java_com_package_MyClass_getFileName__I(_JNIEnv* env, jobject thiz, jint index); 

, UnsatisfiedLinkError almaz ancak ikinci yöntemi ile çağırdığında argüman ilk C++ fonksiyonu çağrılıyor ama ikinci değil. Bu sınıftaki argümanlarla başka yöntemlerim var ama bunların hiçbiri aşırı yüklenmiyor, dolayısıyla ilgili JNI imzaları argüman içermiyor.

Peki, ne yapıyorum yanlış?

cevap

20

Orijinal getFileName işlevinin sonuna bir __ eklemek zorundasınız, artık aşırı yüklenmiş. Sizin 2 C fonksiyon prototipleri şimdi şu şekilde görünmelidir:

JNIEXPORT jstring JNICALL Java_com_package_MyClass_getFileName__ 
    (JNIEnv *, jclass); 

JNIEXPORT jstring JNICALL Java_com_package_MyClass_getFileName__I 
    (JNIEnv *, jclass, jint); 
+0

Bu, denediğim ilk şeydi ancak bir şeyler ters gitti ve UnsatisfiedLinkError'ım var. Şimdi bunu tekrar denedim ve herşeyi işe aldım. Çok teşekkürler! –

25

Sen bu imzaları oluşturmak için javah aracı kullanmak gerekir.

Kullanmak için, native işlevinizin bulunduğu sınıf dosyasını oluşturun. Bir class dosya alırsınız.

javah -jni com.organisation.class_with_native_func çalıştırın, sizin için bir başlık dosyası oluşturur.

Kendiniz düzenlemekten çok daha temiz.

+3

Teşekkürler, kullanmam gereken bu. Ama hala içselleri bilmek çok faydalıdır. –

+0

Veya javah'ı, sınıf dosyasını derlediğiniz dizine yönlendirmek için -classpath komut satırı anahtarını kullanın (yani: 'javah -classpath/yol/to/jar -jni com.package.name.YourClass'). –

İlgili konular