【问题标题】:Include static library via Android Studio 2.3通过 Android Studio 2.3 包含静态库
【发布时间】:2017-08-08 01:18:50
【问题描述】:

我有三个使用 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 中定义,但未被构建找到。

【问题讨论】:

  • 嗨,Ginger,您收到了什么样的错误消息?这些错误消息可以帮助我们调试问题。谢谢。
  • @MartinK.Brown:抱歉,不知怎的,它从原始帖子中被截断了。它现在在那里。 (当然,“不知何故”我的意思是“用户错误”。):)

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


【解决方案1】:

确保您同时构建了 libWrapperLibrary.alibInnererLibrary.a。您需要both 库的副本(例如在jniLibs 中)。以下 CMakeLists.txtnatural 位置选择 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 中库的顺序可能很重要。为了安全起见,我将 inner 放在 wrapper 之后。
  2. 没有简单的方法可以将 inner-lib 对象导入 wrapper-lib,但ndk-build 允许指定使用一个静态库(包括预建一)还需要另一个。这与您的方案无关,因为无法将此信息从 ndk-buildish 转换为 CMakeish
  3. 我知道您更喜欢使用ndk-build 来单独构建它们,就像练习一样,在现实生活中,它们将从外部源预构建。但是,如果您至少自己构建了 wrapper-lib,如果您将ndk-build 也用于生成的共享库,它可以为您省去很多麻烦。 Android Studio 与ndk-build 的集成并不比CMake 差,但是将这两个系统与gradle 混合使用是很疯狂的。

【讨论】:

  • 非常感谢!这正是我所需要的。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多