我有三个使用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中定义,但未在构建中找到。
答案 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)
target_link_libraries
中的库顺序可能很重要 。为了安全起见,我在包装之后加上内部。ndk-build
允许指定使用一个静态库(包括一个预建的)还需要另一个。这与您的方案无关,因为无法将此信息从 ndk-buildish 转换为 CMakeish 。ndk-build
来单独构建它们,就像练习一样,在现实生活中它们将从外部来源预先构建。但是如果你自己至少构建了 wrapper-lib ,那么如果你对生成的共享库也使用ndk-build
,那么可以省去很多麻烦。 Android Studio与ndk-build
的集成度不比CMake
差,但将两个系统与gradle混合是很疯狂的。