我目前正在使用使用共享库的NDK项目。我有两个共享库要集成:libsatprotocol.so和libsat-tanca.so。
所以我将这些库添加到我的Android.mk中,以便进行包装。对于libsatprotocol,一切正常。但是对于libsat-tanca,我在android上崩溃了:
java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "/home/lucas/Rockspoon/satlib/Android/app/src/main/obj/local/armeabi/libsat-tanca.so" needed by "libsat-jni.so"; caused by library "/home/lucas/Rockspoon/satlib/Android/app/src/main/obj/local/armeabi/libsat-tanca.so" not found
at java.lang.Runtime.loadLibrary(Runtime.java:371)
at java.lang.System.loadLibrary(System.java:989)
因此,很奇怪的是,该路径在我用于库的计算机路径中,并且我不知道从何处获取它。如果删除依赖项的libsat-tanca,它可以正常工作(在libsatprotocol中)。
这是我的Android.mk:
LOCAL_PATH := $(call my-dir)
#LOCAL_ALLOW_UNDEFINED_SYMBOLS=true
include $(CLEAR_VARS)
LOCAL_MODULE := sat-tanca
LOCAL_SRC_FILES := tanca/$(TARGET_ARCH_ABI)/libsat-tanca.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := sat-dimep
LOCAL_SRC_FILES := dimep/$(TARGET_ARCH_ABI)/libsatprotocol.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := sat-jni
LOCAL_SRC_FILES := satlib.c
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -lz -llog
LOCAL_SHARED_LIBRARIES := sat-tanca sat-dimep
include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_ABI := armeabi #armeabi-v7a mips x86 x86_64
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libsatprotocol.so $(TARGET_ARCH_ABI)/libsat-tanca.so
SATControl.java
static {
System.loadLibrary("sat-jni");
}
build.gradle(应用程序)
应用插件:“ com.android.application”
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.rockspoon.libraries.satlib"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
ndk {
moduleName "sat-jni"
}
}
sourceSets.main {
jni.srcDirs = [] // This prevents the auto generation of Android.mk
jniLibs.srcDir 'src/main/libs' // This is not necessary unless you have precompiled libraries in your project.
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
def ndkDir = android.ndkDirectory
commandLine "$ndkDir/ndk-build",
'-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source
'-j', Runtime.runtime.availableProcessors(),
'all',
'NDK_DEBUG=1'
}
task cleanNative(type: Exec, description: 'Clean JNI object files') {
def ndkDir = android.ndkDirectory
commandLine "$ndkDir/ndk-build",
'-C', file('src/main/jni').absolutePath, // Change src/main/jni the relative path to your jni source
'clean'
}
clean.dependsOn 'cleanNative'
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn buildNative
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
}
知道为什么它仅将libsat-tanca.so与我的PC路径链接吗?
这里有两件事对我来说似乎是错误的,但是我不确定这是导致链接路径不正确的原因。
1)这行中的$(SYSROOT)变量指向您机器上的路径,对吗?
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -lz -llog
如果目标是链接到zlib和日志库,则可以使用以下内容,并且该版本将执行正确的操作:
LOCAL_LDLIBS += -lz -llog
2)为什么您的Application.mk中的以下行?您不需要这个,但是我认为它可能不会引起链接问题。
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libsatprotocol.so $(TARGET_ARCH_ABI)/libsat-tanca.so
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句