AndroidStudio3.0NDK输出多个so库

2020-05-29 10:31:13 浏览数 (1)

前言

去年的 Android之NDK开发初体验 这篇文章讲述NDK开发环境的搭建,以及在AndroidStudio3.0版本之前的NKDK简单开发。这次升级到Android Studio3.1,再次尝试NDK发现按照之前方法进行so生成会出现一些问题,写的文章已经不是普遍适用了。

代码语言:javascript复制
Error: Your project contains C files but it is not using a supported native
代码语言:javascript复制
To continue using the deprecated NDK compile for another 60 days, set   
android.deprecatedNdkCompileLease=1523451155771 in gradle.properties 

gradle.properties文件尾部添加android.useDeprecatedNdk=true出现第二个错误,在gradle.properties文件尾部添加android.deprecatedNdkCompileLease=1523451155771出现第一个错误。

AndroidStudio3.1使用CMake简单操作

这部分相关的文章有很多,我推荐一篇写的比较详细的博文: Android Studio3.0开发JNI流程------JNI入门级。

  • 首先下载CMake,可以通过SDK-Mananger->SDK-Tools来下载CMake。
  • 然后添加C Support,这个要在新建项目的时侯,选择Include C Support就可以。
  • 然后项目自己创建后会生成Java类、cpp文件,自己编译生成so库直接运行项目就OK了。

CMake的使用

  • 使用CMake只需要修改cpp文件和CMakeLists.txt。
  • CMake生成的cpp文件位于app/src/main/cpp目录,并且cpp文件不需要再引入java类的h文件。
  • CMakeLists.txt位于app目录下

CMakeLists.txt

代码语言:javascript复制
# 有关使用CMake在Android Studio的更多信息,请阅读文档:https://d.android.com/studio/projects/add-native-code.html

# 设置CMake的最低版本构建本机所需库
cmake_minimum_required(VERSION 3.4.1)

# 创建并命名库,将其设置为静态的
# 或共享,并提供其源代码的相对路径。
# 你可以定义多个library库,并使用CMake来构建。
# Gradle会自动将包共享库关联到你的apk程序。
# 添加库
add_library( # 设置库的名称
             native-lib
             # 将库设置为共享库。
             SHARED
             # 为源文件提供一个相对路径。
             src/main/cpp/native-lib.cpp )
# (导入系统库)搜索指定预先构建的库和存储路径变量。因为CMake包括系统库搜索路径中默认情况下,只需要指定想添加公共NDK库的名称,在CMake验证库之前存在完成构建
find_library( # 设置path变量的名称
              log-lib
              # 在CMake定位前指定的NDK库名称
              log )
# (链接目标库)指定库CMake应该链接到目标库中,可以链接多个库,比如定义库,构建脚本,预先构建的第三方库或者系统库
target_link_libraries( # 指定目标库
                       native-lib
                       # 目标库到日志库的链接 包含在NDK
                       ${log-lib} )

添加native方法

添加native方法.png

Alt Enter快捷键自动创建C 方法,不需要头文件。

生成多个so文件

  • java层多次加载so库
代码语言:javascript复制
// Used to load the 'native-lib' library on application startup.
static {
    System.loadLibrary("native-lib");
}
代码语言:javascript复制
public class JNIUitls {
    static {
        System.loadLibrary("jnilib");
    }

    public static native String getNameString();

    public native int getNumber();
}
  • 在cpp目录下创建对应的.cpp文件
  • 在CmakeLists.txt文件中对应添加so库和链接so库
代码语言:javascript复制
#添加库
add_library( # Sets the name of the library.
             native-lib
             # Sets the library as a shared library.
             SHARED

             # Provides a relative path to your source file(s).
             src/main/cpp/native-lib.cpp
             )
#添加库
add_library(jnilib SHARED src/main/cpp/jnilib.cpp)

#导入系统库
find_library( # Sets the name of the path variable.
              log-lib

              # Specifies the name of the NDK library that
              # you want CMake to locate.
              log )

#链接目标库
target_link_libraries( # Specifies the target library.
                       native-lib
                       # Links the target library to the log library
                       # included in the NDK.
                       ${log-lib} )
#链接目标库
target_link_libraries(jnilib ${log-lib})

so.png

项目地址:JNIApplication

(https://github.com/stven0king/JNIApplication.git)

0 人点赞