2016-05-04 41 views
1

我完全不熟悉JNI,必須使用現有的.so文件。 問題是Android Studio無法找到JNI功能。 我打開我的庫代碼類同此:無法使用.so文件解析相應的JNI函數

public class MyService extends Service{ 

    static { 
     System.loadLibrary("mylib"); 
    } 

    private native void example(); 

} 

,它給了我一個錯誤「無法解析對應的JNI功能Java_com_company_app_MyService_example」。

如果我運行此命令(在終端)

arm-linux-androideabi-nm -DC mylib.so 

我得到的,別人之間(我需要的庫只有少數功能),

register_com_company_app_service(_JNIEnv*) 

(而不是爲MyService有服務)

我該怎麼辦?載入圖書館有問題還是還有其他問題?

我也嘗試在「服務」中的折射類名「MyService」,但「Java_com_company_app_service_example」也沒有解決!

提前致謝!

+0

你實現一個對你'build.gradle'庫? – Aspicas

+0

Ehm no ...我該怎麼辦? – Mirko

+0

檢查我的答案如何在'AndroidStudio'中包含'* .so'文件,也許可以幫助你,http://stackoverflow.com/a/33164947/3626214 – Aspicas

回答

2

您需要記住函數簽名必須與Java中的名稱相匹配,並且必須導出它。
另外,成員函數接收對象作爲第一個參數,靜態函數接收該類。

#ifdef __cplusplus 
extern "C" { 
#endif 
JNIEXPORT void JNICALL Java_Namespace_Class_MemberFunction 
     (JNIEnv *, jobject); 

JNIEXPORT void JNICALL Java_Namespace_Class_StaticFunction 
     (JNIEnv *, jclass); 

#ifdef __cplusplus 
} 
#endif 

所以你的情況這將是:

JNIEXPORT void JNICALL Java_com_company_app_MyService_example 
     (JNIEnv *, jobject);