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

时间:2019-05-02 03:55:41

标签: android android-ndk

我有一个第三方.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:-这只是我要尝试完成的许多工作之一。

1 个答案:

答案 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'
    }
    ...
}

请参阅:libsupportjni.so files added in the project