前言
去年的 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库
// 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库
#添加库
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)