通过Android Studio 2.3包含静态库

时间:2017-03-16 17:46:09

标签: android-studio android-ndk android-gradle

我有三个使用Android NDK的项目。前两个构建静态库(一个包含另一个)。我试图将它们作为第三部分构建的一部分,但是根据我在android studio 2.3中设置应用程序的方式得到各种错误。

我已经阅读了关于此的其他问题,但它们都指的是将库构建为同一个makefile的一部分。我需要能够将两者构建为不同品牌的一部分,并从相对路径引用内部库。

这是我可以创建的最基本的例子。

https://github.com/ginger-mcmurray/android.mk-inner-library-sample

构建内部库可以正常工作。构建包装器库也可以工作,我可以通过在创建的.a文件上运行nm来判断。

PLNA007982-MBP:arm64-v8a ginger.mcmurray$ nm libInnerLibrary.a 

inner-library.o:
0000000000000000 n $d.1
0000000000000000 n $d.2
0000000000000000 n $d.3
0000000000000000 n $d.4
0000000000000000 n $d.5
0000000000000000 n $d.6
0000000000000000 r $d.7
0000000000000000 n $d.8
0000000000000000 t $x.0
0000000000000000 T innerLibraryMethod

PLNA007982-MBP:arm64-v8a ginger.mcmurray$ nm libWrapperLibrary.a 

wrapper-library.o:
0000000000000000 n $d.1
0000000000000000 n $d.2
0000000000000000 n $d.3
0000000000000000 n $d.4
0000000000000000 n $d.5
0000000000000000 n $d.6
0000000000000000 r $d.7
0000000000000000 n $d.8
0000000000000000 t $x.0
                 U innerLibraryMethod
0000000000000000 T wrapperLibraryMethod

我已经按照我在这里找到的所有答案中的建议,但没有一个能够奏效。 github上的当前版本没有构建。错误是

/Users/ginger.mcmurray/Jay-s-POC/ndk-test/hello-jni/app/src/main/cpp/src/hello-jni.c
Error:(34) undefined reference to 'wrapperLibraryMethod'

wrapperLibraryMethod在libWrapperLibrary.a中定义,但未在构建中找到。

1 个答案:

答案 0 :(得分:4)

确保您已构建 libWrapperLibrary.a libInnererLibrary.a 。您需要某处两个库的副本(例如 jniLibs )。以下 CMakeLists.txt 自然位置选择 inner-lib ,为我节省了复制的麻烦。

您必须单独添加两个库,并在target_link_libraries中明确指定它们:

cmake_minimum_required(VERSION 3.4.1)

add_library( wrapper-lib
             STATIC
             IMPORTED )
add_library( inner-lib
             STATIC
             IMPORTED )
set_target_properties( # Specifies the target library.
                       wrapper-lib

                       # Specifies the parameter you want to define.
                       PROPERTIES IMPORTED_LOCATION

                       # Provides the path to the library you want to import.
                       ${CMAKE_CURRENT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}/libWrapperLibrary.a )
set_target_properties( # Specifies the target library.
                       inner-lib

                       # Specifies the parameter you want to define.
                       PROPERTIES IMPORTED_LOCATION

                       # Provides the path to the library you want to import.
                       ${CMAKE_CURRENT_SOURCE_DIR}/../../../../../inner-library/obj/local/${ANDROID_ABI}/libInnerLibrary.a )

add_library(hello-jni SHARED
            src/hello-jni.c)

# Include libraries needed for hello-jni lib
target_link_libraries(hello-jni
                      wrapper-lib inner-lib
                      android
                      log)
  1. target_link_libraries 中的库顺序可能很重要 。为了安全起见,我在包装之后加上内部
  2. 没有简单的方法可以将 inner-lib 对象导入 wrapper-lib ,但ndk-build允许指定使用一个静态库(包括一个预建的)还需要另一个。这与您的方案无关,因为无法将此信息从 ndk-buildish 转换为 CMakeish
  3. 我知道您更喜欢使用ndk-build来单独构建它们,就像练习一样,在现实生活中它们将从外部来源预先构建。但是如果你自己至少构建了 wrapper-lib ,那么如果你对生成的共享库也使用ndk-build,那么可以省去很多麻烦。 Android Studio与ndk-build的集成度不比CMake差,但将两个系统与gradle混合是很疯狂的。