总结下Android studio配置NDK的过程,实现你的第一个jni(Java native interface).
下载NDK
1.官方下载地址:https://developer.android.google.cn/ndk/downloads/index.html
2.民间下载地址:http://www.androiddevtools.cn/
选择与自己电脑相匹配包,下载到本地,解压。
配置到android studio中
打开android studio,新建android项目,打开File->Project Structure:
![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/3379d58c3811eb779cb56e3777dc768d.png)
选择刚才下载的NDK解压的路径:
![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/31cbe212c516fd2bb87d49882aef0965.png)
这时候在项目的local.properties文件会出现NDK的配置:
![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/e10439488cf2b5f1f511572ae13fdc1a.png)
还要在gradle.properties里面加上android.useDeprecatedNdk=true:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iNxYmY2QmYjR2NidzYldDMyQWZlRmM5IGMkZGOiNjY58CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
新建NativeTest.java
public class NativeTest {
static {
System.loadLibrary("Hello");
}
public static native String getString();
}
产生.h头文
1.编译项目生成NativeTest .class
编译项目后.class文在项目的如下路径: ``` D:\google\decompilation\workspace\ForceApkObj\app\build\intermediates\classes\debug ``` ![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/6d112ebb2a3ae23b2f6fb49319c09cd8.png)```
2.利用javah命令产生.h头文件
打开Android studio的Terminal终端,进入项目的app/src/main目录:
![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/516ecfc8c9af7f02073ad4ff61a3fb89.png):
使用命令javah生成h文件:
javah -d jni -classpath D:\google\decompilation\workspace\ForceApkObj\app\build\intermediates\classes\debug com.biyou.forceapkobj.NativeTest
注:
1.javah是命令
2.-d jni :在Terminal终端命令行所以的目录(这时候是app/src/main)新建一个名为jni的文件夹。
3.-classpath D:\google\decompilation\workspace\ForceApkObj\app\build\intermediates\classes\debug: 项目所有类文件生成的目录
4.com.biyou.forceapkobj.NativeTest:类名
然后在main目录底下会生成一个jni文件夹,里面会有一个com_biyou_forceapkobj_NativeTest.h文件
新建.c文件
![这里写图片描述](https://img-blog.csdnimg.cn/img_convert/0c7ee97443bdd96d1b17e4edc4cc80ee.png)
编写c代码:
#include <com_biyou_forceapkobj_NativeTest.h>
//返回一个字符串
JNIEXPORT jstring JNICALL Java_com_biyou_forceapkobj_NativeTest_getString
(JNIEnv *env, jclass jobj) {
return (*env)->NewStringUTF(env,"Hello World");
}
配置buid.gradle
defaultConfig {
.....
ndk {
moduleName "Hello"//指定生成的so文件名
abiFilters "armeabi", "armeabi-v7a", "x86"//cpu的类型
}
}
注意:这里的moduleName要与NativeTest.java里面的System
.loadLibrary(“xxx”)一致。
调jni的getString()方法
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView content = new TextView(this);
content.setText(NativeTest.getString());
setContentView(content);
}
}