android - 如何仅在编译时使用 .so 库?

标签 android android-ndk

我有一个第三方.so 库,我只需要在编译时在我的应用程序中使用它。图书馆的提供者说:-

NOTE: DO NOT include thelibrary.so as part of agent APK. Use for compilation purpose only.

我的 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 包括在内。但是,当我使用同一库的较新版本 2 作为 PREBUILT_SHARED_LIBRARY 时,它会提示

cannot locate symbol "_ZNK7android8String164sizeEv" referenced by thefinalbuiltlibrary.so .

关于忽略所有符号 LDFLAG :- 这是我正在努力使这项工作的众多事情之一。

最佳答案

How do I add this library for compilation only?

可能您在进行 apk 打包时试图排除该共享库。将以下代码 fragment 放入您的 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'
    }
    ...
}

参见:libsupportjni.so files added in the project

关于android - 如何仅在编译时使用 .so 库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55945468/

相关文章:

java - Android native 链接器特别需要名为 libjpeg.so.62 的文件

Android Things,如何捕获进程终止

java - 错误: Unfortunately My Fist App has stopped working

java - ComponentCallbacks2 的 onTrimMemory() 没有被调用

带有 2 个库和 jniLibs 的 Android 应用程序 - 使应用程序崩溃

android - 如何在 ANativeWindow 上显示 JPEG?

java - 相机拍的照片越来越模糊

java - 如何实现 String 变量而不是 'Landschaft' ?

android - 应用程序在模拟器上运行良好,但在设备上崩溃并出现 : java. lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__aeabi_memcpy"

安卓 NDK : Including boost c++ library