Android studio 通过Android Studio 2.3包含静态库

Android studio 通过Android Studio 2.3包含静态库,android-studio,android-ndk,android-gradle-plugin,Android Studio,Android Ndk,Android Gradle Plugin,我有三个使用Android NDK的项目。前两个构建静态库(一个包含另一个)。我正试图将它们作为第三个版本的构建的一部分,但根据我在android studio 2.3中设置应用程序的方式,会出现各种错误 我已经阅读了关于这个问题的其他问题,但它们都提到将库构建为同一个makefile的一部分。我需要能够将两者构建为不同make的一部分,并从相对路径引用内部lib 下面是我能创建的最基本的示例 修建内部图书馆效果良好。构建包装器库也很有效,我可以通过在创建的.a文件上运行nm来判断这一点 PL

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

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

下面是我能创建的最基本的示例

修建内部图书馆效果良好。构建包装器库也很有效,我可以通过在创建的.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'

WrapperLibrary方法在libWrapperLibrary.a中定义,但未被生成找到。

确保同时生成了libWrapperLibrary.alibinnerLibrary.a。您需要这两个库的副本(例如在jniLibs中)。下面的CMakeLists.txt从其自然位置拾取内部库,为我省去了复制的麻烦

必须分别添加这两个库,并在
target\u link\u库
中明确指定它们:

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)

  • 目标链接库中库的顺序可能很重要。为了安全起见,我将内部放在包装后
  • 没有简单的方法将内部库对象导入到包装库,但是
    ndk build
    允许指定使用一个静态库(包括预构建库)还需要另一个静态库。这与您的场景无关,因为无法将此信息从ndk buildish转换为CMAKESH
  • 我知道您更喜欢使用
    ndk build
    单独构建它们,这只是一个练习,在现实生活中,它们将从外部源预构建。但是,如果您自己至少构建了包装库,那么如果您也为生成的共享库使用
    ndk build
    ,可能会让您省去很多麻烦。Android Studio与
    ndk build
    的集成并不比与
    CMake
    的集成差,但将这两个系统与gradle混合使用是愚蠢的

  • 确保同时构建了libWrapperLibrary.alibinernerlibrary.a。您需要这两个库的副本(例如在jniLibs中)。下面的CMakeLists.txt从其自然位置拾取内部库,为我省去了复制的麻烦

    必须分别添加这两个库,并在
    target\u link\u库
    中明确指定它们:

    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)
    

  • 目标链接库中库的顺序可能很重要。为了安全起见,我将内部放在包装后
  • 没有简单的方法将内部库对象导入到包装库,但是
    ndk build
    允许指定使用一个静态库(包括预构建库)还需要另一个静态库。这与您的场景无关,因为无法将此信息从ndk buildish转换为CMAKESH
  • 我知道您更喜欢使用
    ndk build
    单独构建它们,这只是一个练习,在现实生活中,它们将从外部源预构建。但是,如果您自己至少构建了包装库,那么如果您也为生成的共享库使用
    ndk build
    ,可能会让您省去很多麻烦。Android Studio与
    ndk build
    的集成并不比与
    CMake
    的集成差,但将这两个系统与gradle混合使用是愚蠢的

  • 嗨,金吉尔,你收到了什么样的错误信息?这些错误消息可能有助于我们调试问题。谢谢。@MartinK.Brown:对不起,不知怎的,它从原来的帖子上被删掉了。它现在在那里。(当然,我所说的“莫名其妙”是指“用户错误”):)嗨,金吉尔,你收到了什么样的错误消息?这些错误消息可能有助于我们调试问题。谢谢。@MartinK.Brown:对不起,不知怎的,它从原来的帖子上被删掉了。它现在在那里。(当然,“莫名其妙”是指“用户错误”):)非常感谢!这正是我所需要的非常感谢你!这正是我所需要的