2012-04-10 20 views
3

我成功加載了/system/libs/my_lib.so目錄中的庫。我如何使用這個庫中定義的C/C++函數?用於加載庫的System.load

public class MainFrom extends Activity { 

    private static final String LOG_TAG = "MainFrom"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     // How to use the functions of test_lib.so? 

     /* 
      java.lang.UnsatisfiedLinkError: stringFromC 


     String s1 = stringFromC(), s2 = stringFromCpp(); 

     Log.w(LOG_TAG, stringFromC()); 
     Log.w(LOG_TAG, stringFromCpp()); */ 
    } 

    public native String stringFromC(); 
    public native String stringFromCpp(); 

    static { 
     try { 
      System.load("/system/lib/test_lib.so"); 
      Log.i(LOG_TAG, "MainFrom. Success!"); 
     } catch (UnsatisfiedLinkError e) { 
      Log.e(LOG_TAG, "MainFrom. UnsatisfiedLinkError"); 
     } 
    } 

} 

stringFromCstringFromCpp存在並且進行了彙編,以test_lib.so

+0

你可以分享你的Android.mk文件,也.C和.cpp? – 2012-04-10 10:53:43

+0

@NISHAnT如何分享?我正在構建Cyanogen,我的測試庫位於「外部」文件夾中,c和cpp功能的使用位於「framesworks」文件夾中。如果可能的話,共享代碼爲 – 2012-04-10 11:23:44

+0

。 – 2012-04-10 11:32:39

回答

3

我已經解決了我的問題。

有必要寫

System.load("/system/lib/libtest_lib.so"); 

,而不是

System.load("/system/lib/test_lib.so"); 

太奇怪了。如果我運行

adb shell 
ls /system/lib 

我會看到test_lib.so文件。爲什麼使用lib前綴加載庫是正確的?

+0

不,不需要使用lib前綴。如果你想使用ANDROID_SOURCES/external/your_lib /中的JNI函數,你應該把它們叫做'Java_com_your_pack_name_YourClass_yourJniMethod'並且創建一個包含'System.load(「/ system/lib/test.so」)的靜態初始化塊' – 2012-05-28 06:42:19

+0

我知道這個是舊的,但你能解釋一下你上面說的嗎?我試圖從/存儲(內部存儲) – 2016-07-16 05:21:22

0

你需要把LOCAL_CPPFLAGS := $(YOURMODULE_CPPFLAGS)LOCAL_SRC_FILES := yourfile.cpp在你的Android.mk文件來編譯.cpp文件與Android NDK .c.cpp文件。

希望它能幫助你。

0

從Android 7.0開始,系統會阻止應用程序動態鏈接到非NDK庫,這可能會導致您的應用程序崩潰。這種行爲變化旨在通過平臺更新和不同設備創建一致的應用體驗。

android 7.0 changes description

相關問題