切換到Android Studio之後,我開始看到了可怕的Android原生庫消失,一旦應用程序被安裝
java.lang.UnsatisfiedLinkError: dlopen failed: library
'/data/app-lib/com.myapp.test-1/libmylib.so' not found
錯誤。當我解壓縮apk時,我可以在lib/armeabi文件夾下看到libmylib.so以及所有其他本地庫(libmyotherlib.so和libtest.so),因此包裝不應該成爲問題...我決定根我的測試設備並查看/ data/app-lib下應用文件夾的實際內容,其中本機庫應該安裝後 - 我發現應用程序的一個本機庫(libmylib.so)在應用程序後失蹤安裝在設備上。 libmylib.so和libmyotherlib.so是預建的.so文件,位於src/main/jniLibs中,而libtest.so是從src/main/jni中的test.c編譯的。
這隻在我切換到Android Studio後纔開始;我已經驗證過,在Eclipse ADT中使用相同代碼構建的apks安裝後,所有必需的庫都存在於/data/app-lib/com.myapp.test-1下。
相關的build.gradle爲Android Studio生成:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "com.myapp.test"
minSdkVersion 17
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk{
moduleName "test"//testing ndk integration
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
repositories {
// You can also use jcenter if you prefer
mavenCentral()
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
//android support libs etc.
compile 'com.android.support:appcompat-v7:23.1.0'
compile 'com.android.support:support-v13:23.1.0'
}
相關gradle.properties文件
android.useDeprecatedNdk=true
下的src/main/JNI我只有test.c的
#include <jni.h>
int main(){
return 0;
}
and under src/main/jniLibs/armeabi我有
libmylib.so
libmyotherlib.so
相關Android.mk爲Eclipse ADT編譯:
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES += test.c
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := myotherlib
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libmyotherlib.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := mylib
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libmylib.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
相關/ data/app中-lib的內容安裝的應用程序由Android工作室建成後:
[email protected] SL-K40:/ # ls /data/app-lib/com.myapp.test-1
libmyotherlib.so
libtest.so
相關/數據/ APP-安裝由Eclipse ADT構建的應用程序之後的lib內容:
[email protected] SL-K40:/ # ls /data/app-lib/com.myapp.test-1
libmylib.so
libmyotherlib.so
libtest.so
我不小心fo UND通過添加
sourceSets {
main {
jni.srcDirs = []
}
}
我的build.gradle我能得到libmylib.so在安裝後再次現身,但排除有在我的項目的任何NDK源代碼。
第一個問題: 任何想法可能會發生什麼嗎?難道是因爲mylib實際上是針對除armeabi以外的其他abi進行編譯的,Android會放棄它,因爲它的實際abi與它在apk內部進入的文件夾不匹配(我沒有mylib的源代碼)?我的問題聽起來很像here,但是這個人似乎在最終安裝的應用程序中只能看到一個共享庫;我看到的都是我的共享庫中的一個。
第二個問題: 在Android Studio構建中包含預構建.so文件的當前正確方法是什麼? Cluesaroundthe 'net似乎根據Android Studio版本(我使用的是Android Studio 1.5,Gradle版本2.4,Android插件版本1.3。0)是否仍然需要將jniLibs.srcDir變量重定向到src/main/libs?
我的猜測是它的某些gradle任務正在破壞構建 – Bhargav
首先,您不需要root來訪問**/data/app-lib/com.myapp.test-1/*中的庫。 * –
@AlexCohn是真的,但你確實需要root通過adb shell'ls -al/data/app-lib'列出/ data/app-lib的內容,而且我不想讓我的應用程序的文件夾在運行時從名稱上下文:: getApplicationInfo()。nativeLibraryDir – CCJ