2010-10-27 103 views
19

我有一個NDK庫和相應的Java類的工作實現。但我無法將重載的方法添加到該類。目前我的類包含:在Android NDK中編寫本機方法簽名的正確方法是什麼?

package com.package; 

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

我jniwrappers.cpp文件具有以下聲明:

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

到目前爲止一切正常。但接下來我修改我的課:

package com.package; 

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

,並加入到jniwrappers.cpp另一聲明:

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

它編譯罰款,Android應用程序啓動時,沒有得到UnsatisfiedLinkError但是當它調用第二個方法與第一個C++函數被調用的參數,但不是第二個。我有其他的方法在該類中的參數,但沒有重載,所以他們各自的JNI簽名不包含參數。

那麼,我做錯了什麼?

回答

20

您必須將__添加到原始getFileName函數的末尾,因爲它已被重載。你2 C函數原型現在應該是這樣的:

JNIEXPORT jstring JNICALL Java_com_package_MyClass_getFileName__ 
    (JNIEnv *, jclass); 

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

這是我嘗試的第一件事,但出錯了,我得到了UnsatisfiedLinkError。現在我重試了這一切,並使一切正常。非常感謝! – 2010-10-27 18:03:09

25

您應該使用javah工具生成的簽名。

要使用它,建立你有你的native函數的類文件。你會得到一個class文件。

運行javah -jni com.organisation.class_with_native_func,它會爲你生成一個頭文件。

它比你自己編輯它要乾淨得多。

+3

謝謝,這就是我應該使用的。但仍然知道內部是非常有用的。 – 2010-11-02 08:19:04

+0

或者只是使用-classpath命令行開關將javah指向您編譯類文件的目錄(即:'javah -classpath/path/to/jar -jni com.package.name.YourClass')。 – 2016-11-19 02:06:27

相關問題