网上很多资料都比较旧,我查了一些资料,并且试了一下,总结了一个最简单的配置ndk开发的方法,步骤如下:
1. 在SDK Tools中勾选安装CMake、LLDB、NDK
2. 配置External Tools,省去了自己敲命令
参数讲解
javah 用于生成头文件
Program:$JDKPath$/bin/javah
Parameters:-d ../jni -jni $FileClass$
Working directory:$SourcepathEntry$\..\java
ndk-build 用于构建so包
注意:MAC/Linux用ndk-build,没有.cmd后缀
Program:D:\adt\sdk\ndk-bundle\ndk-build.cmd
Parameters:什么都不用填
Working directory:$ModuleFileDir$\src\main
我的javah配置是
Program:/usr/bin/javah
Parameters:-d ../jni -jni $FileClass$
Working directory:$SourcepathEntry$/../java
我的ndk-build配置是
Program:$ANDROID_HOME/ndk-bundle/ndk-build
Working directory:$ModuleFileDir$/src/main
3. 在工程的local.properties文件中配置NDK的目录
ndk.dir=/Users/user/Library/Android/sdk/ndk-bundle
sdk.dir=/Users/user/Library/Android/sdk
4. 创建CMakeLists.txt
#定义cmake支持的最小版本号
cmake_minimum_required(VERSION 3.4.1)
add_library( # 设置生成so库的文件名称,例如此处生成的so库文件名称应该为:native-lib.so
native-lib
# 设置生成的so库类型,类型只包含两种:
# STATIC:静态库,为目标文件的归档文件,在链接其他目标的时候使用
# SHARED:动态库,会被动态链接,在运行时被加载
SHARED
# 设置源文件的位置,可以是很多个源文件,都要添加进来,注意相对位置
src/main/jni/hello.cpp )
# 从系统里查找依赖库,可添加多个
find_library( # 例如查找系统中的log库liblog.so
log-lib
# liblog.so库指定的名称即为log,如同上面指定生成的libnative-lib.so库名称为native-lib一样
log )
# 配置目标库的链接,即相互依赖关系
target_link_libraries( # 目标库(最终生成的库)
native-lib
# 依赖于log库,一般情况下,如果依赖的是系统中的库,需要加 ${} 进行引用,
# 如果是第三方库,可以直接引用库名,例如:
# 引用第三方库libthird.a,引用时直接写成third;注意,引用时,每一行只能引用一个库
${log-lib} )
文件中的native-lib
是我生成的so文件的名字,
src/main/jni/hello.cpp
是我实现的native方法所在的类,注意路径不要写错,我的文件所在路径是这样的
5. 在模块的build.gradle文件中添加
android {
compileSdkVersion 26
buildToolsVersion "26.0.0"
defaultConfig {
externalNativeBuild {
cmake {
cppFlags ""
}
}
}
externalNativeBuild {
cmake {
path "CMakeLists.txt"
}
}
}
6. 创建native方法
package com.test;
public class NativeHelper {
static {
System.loadLibrary("native-lib");
}
public native String stringFromJNI();
}
7. 编写cpp文件
#include "stdio.h"
#include "jni.h"
#include "string"
extern "C"
JNIEXPORT jstring JNICALL Java_com_test_NativeHelper_stringFromJNI
(JNIEnv *env,
jobject jobject1){
return env->NewStringUTF("hello world from cpp");
}
然后项目就可以运行了
参考链接:https://www.jianshu.com/p/1e14dcc81c3c
参考链接的文章不太详细,我改了改,写了上文