2013-03-03 108 views
6

我有兩個第三方本機庫,如libfoo.solibbar.so。我很難加載這兩個庫。我已將它們複製到libs文件夾下適當的CPU拱(armeabi,mips和x86)以及設置本機libs目錄下項目結構>模塊> Android>結構指向此libs文件夾。我只能加載一個庫,但不能加載其他庫。如果我嘗試一次加載一個(刪除其他庫),它運行良好。那我得到的例外是:如何在IntelliJ中添加多個本機庫(.so)文件

java.lang.UnsatisfiedLinkError: Couldn't load foo from loader dalvik.system.PathClassLoader 

我應該怎麼做有的IntelliJ或Android運行時找到這兩個機庫?

+2

你是如何加載它們的? – bricklore 2013-03-04 16:36:10

+0

您是否查看了生成的.APK文件以查看放置在那裏的內容?它只是一個zip文件 - 用7-Zip或任何其他zip文件管理器打開它,你應該看到所有的.so文件。 – SomeCallMeTim 2014-01-07 20:46:49

+0

@SomeCallMeTime:感謝兄弟教我如何參考apk內的庫。 我遇到了一個問題 java.lang.UnsatisfiedLinkError:未找到針對nativeNewInstance android autonavi map的實現。我在我的代碼中添加了兩個第三方jni庫。發現一個lib支持多個cpu架構,一個只支持armeabi,所以我從支持多個cpu的架構中刪除了其他架構,並且只將armeabi文件放入我的項目中,現在工作正常 – 2015-02-07 07:31:17

回答

0

它是完全可以找到加載多個本機庫。只需將它們複製到/ libs/CPU_ARCH /目錄。但是,所有庫都需要具有相同的體系結構。如果讓說libfoo.so是armeabi但libbar.so是x86,那麼只有一個會被複制(就像我之前的試用版一樣)。

然後,你可以加載它:

static { 
    //the following 3 are identical 
    //System.load(context.getApplicationInfo().dataDir + "/lib/libfoo.so"); 
    //Runtime.getRuntime().load(context.getApplicationInfo().dataDir + "/lib/libfoo.so"); 
    System.loadLibrary("foo"); 

    System.loadLibrary("bar"); 
} 

如果的System.loadLibrary()失敗,那麼你可以使用System.load()或調用Runtime.getRuntime()嘗試用全路徑負載負載()

相關問題