【发布时间】:2019-05-02 03:55:40
【问题描述】:
我有一个第三方 .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
我们在项目中使用了这个库的另一个版本。让我们称之为 Version 1,并将 Version 1 包含为 PREBUILT_SHARED_LIBRARY。但是,当我使用与 PREBUILT_SHARED_LIBRARY 相同的库的较新 Version 2 时,它会抱怨
无法定位最终构建库.so 引用的符号“_ZNK7android8String164sizeEv”。
关于忽略所有符号LDFLAG :- 这是我试图完成这项工作的众多事情之一。
【问题讨论】:
-
嗯...我认为您需要多说一些关于正在发生的事情。为什么需要图书馆?如果不提供会怎样?您忽略了未定义的符号...发生了什么变化使这一切变得必要?
-
@G.BlakeMeike 为上述问题添加了更新。
-
这仍然没有多大意义。
_ZNK7android8String164sizeEv是 android::String16`,它不是 NDK API。如果您的应用程序没有提供该功能,则说明您从系统中错误地加载了它,并且这只适用于 N 之前的设备。如果它是由您的应用提供的,那么您构建的库应该无关紧要,因此您应该只构建您发布的库。 -
LOCAL_LDFLAGS:= -Wl,--unresolved-symbols=ignore-all这个标志只是将构建错误变成运行时错误。我建议删除它。
标签: android android-ndk