欢迎批评指正,谢谢。
准备:Android studio(当前是3.3.2版本),NDK工具包(下载后需要配置到studio中)
1.新建类TestNDK.java(存放的位置随意),如下
public class TestNDK {
static {
System.loadLibrary("testndk");
}
public native String getString();
}
2.打开Terminal,执行命令 cd app/src/main,进入到Main文件夹下
3.执行javah -d jni -classpath ./Java 包名.TestNDK
然后会在main文件夹下面,生成一个jni 文件夹(与Java同级),并且会生成一个TestNDK类对应的.h文件,如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jni_ndk_testapp_TestNDK */
#ifndef _Included_com_example_jni_ndk_testapp_TestNDK
#define _Included_com_example_jni_ndk_testapp_TestNDK
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_jni_ndk_testapp_TestNDK
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_jni_1ndk_1testapp_TestNDK_getString
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
4.复制.h文件到jni文件夹下,修改后缀名为.c,这一步即是创建c文件(也可以创建c++文件,后缀名为.cpp,另外语法略有不同),实现与用native定义的java方法的对应的c方法,
如下,只有方法体被改动,返回了一个字符串
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jni_ndk_testapp_TestNDK */
#ifndef _Included_com_example_jni_ndk_testapp_TestNDK
#define _Included_com_example_jni_ndk_testapp_TestNDK
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_jni_ndk_testapp_TestNDK
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_jni_1ndk_1testapp_TestNDK_getString
(JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"Hello from c!");
}
#ifdef __cplusplus
}
#endif
#endif
5,在jni文件夹下,新建Android.mk文件和Application.mk文件
Android.mk文件,内容如下
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := testndk//要生成的so文件的名字
LOCAL_SRC_FILES := TestNDK.c//要编译的c源文件,如果是多个c文件的话用\分割就行了如:=TestNDK.c\TestNDK1.c, \ 两边要留有空格
include $(BUILD_SHARED_LIBRARY)
Application.mk文件,内容如下
APP_ABI := armeabi//指定要生成那些cpu架构类型的so文件
6.右键moudle(这里是app),选择 Link C++ Progect with Gradle -> 选ndk-build 和 Android.mk 文件,该moudle下的gradle文件会多出如下内容(在android{}下,和defaultConfig 同级)
externalNativeBuild {
ndkBuild {
path file('src/main/jni/Android.mk')
}
}
7.在 build / intermediates / ndkBuild 下即可找到生成的so文件。
实例化 TestNDK 的对象,调用getString方法,即可获取返回值。
参考文章:https://www.jianshu.com/p/eae320ee9b2d