我有一个第三方.so
库,仅在我的应用程序中需要在编译时使用。图书馆的提供者说:-
注意:请勿将thelibrary.so包含在代理APK中。仅用于编译目的。
我的build.gradle
中有此内容:-
task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') {
def ndkDir = project.android.ndkDirectory.absolutePath
project.logger.debug('my debug message')
if (ndkDir == null) {
ndkDir = "/usr/local/bin"
}
commandLine "$ndkDir/ndk-build",
'-C', file('src/main').absolutePath, // Change src/main/jni the relative path to your jni source
'-j', Runtime.runtime.availableProcessors(),
'all',
'NDK_DEBUG=1'
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn ndkBuild
}
和Android.mk
文件如下所示:-
LOCAL_PATH:= $(call my-dir)
LOCAL_C_INCLUDES:= $(LOCAL_PATH)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES:= $(LOCAL_PATH)
LOCAL_MODULE:= mymodulename
LOCAL_STL := c++_static
LOCAL_CPPFLAGS := -std=c++11
LOCAL_LDLIBS := -ldl -llog
LOCAL_LDLIBS += -fuse-ld=bfd
LOCAL_LDLIBS += -lz
LOCAL_LDLIBS += -ljnigraphics
LOCAL_LDLIBS += -landroid
LOCAL_LDLIBS +:= -Lmylibrary.so <-------THIS IS THE THIRD PARTY LIB
LOCAL_LDFLAGS:= -Wl,--unresolved-symbols=ignore-all
LOCAL_SRC_FILES:= mylocalfile_using_thecode_from_so_file.cpp
include $(BUILD_SHARED_LIBRARY)
我知道我可以将myLibrary.so
添加为一个单独的模块,并将其打包为PREBUILT_SHARED_LIBRARY
,但是该库的提供者表示不应将其与apk打包在一起,应该仅在编译时使用。
如何添加此库仅用于编译?
我不使用cmake。这是一个旧项目,由于某种原因,没有升级的目标。
更新#1
我们在项目中使用了该库的另一个版本。我们将其称为版本1 ,并将版本1 包含为PREBUILT_SHARED_LIBRARY
。但是,当我使用与PREBUILT_SHARED_LIBRARY
相同库的较新的版本2 时,它会抱怨
无法找到由finalbuiltlibrary.so引用的符号“ _ZNK7android8String164sizeEv”。
关于忽略所有符号LDFLAG
:-这只是我要尝试完成的许多工作之一。
答案 0 :(得分:1)
如何添加此库仅用于编译?
在进行apk打包时,您可能试图排除该共享库。将以下代码段放入您的app/build.gradle
中可以达到以下目的:
android {
...
packagingOptions {
exclude 'lib/x86/thefinalbuiltlibrary.so'
exclude 'lib/x86_64/thefinalbuiltlibrary.so'
exclude 'lib/armeabi-v7a/thefinalbuiltlibrary.so'
exclude 'lib/arm64-v8a/thefinalbuiltlibrary.so'
}
...
}