0.配置ndk路径
在project项目的local.properties里面加上ndk路径
ndk.dir=D\:\\NDK\\android-ndk-r11b
1.在project 下的gradle.properties,里面加上:
ndk.dir=D\:\\NDK\\android-ndk-r11b
image
2.在app 的build.gradle的
defaultConfig里面加入
ndk {
moduleName "JniTest"
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
moduleName 就是so库的库名。第二行打印log,第三行是支持的体系架构,完整如下
image3.我们写本地方法(可以单独创建类,也可以直接在已有的类里面写),
image4.调用本地方法,然后build项目(我此处,点击button,改变textview的文本),你会在 项目名\app\build\intermediates\classes\debug(项目包名) 下找到生成的class文件
image5.最重要的一步:打开as 的terminal,进入 项目名\app的main目录下,输入:
javah -d jni -classpath <SDK_android.jar>;<APP_classes> education.bbk.com.myapplication.TestJJ
我的是:
image此时你会发下生成了.h文件
image6.创建main.c文件(文件命任意),打开.h文件,我们复制方法名过来,写好的如下,我们再次build
image* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <android/log.h>
#ifndef LOG_TAG
#define LOG_TAG "ANDROID_LAB"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif
/* Header for class lab_sodino_jnitest_MainActivity */
#ifndef _Included_lab_sodino_jnitest_MainActivity
#define _Included_lab_sodino_jnitest_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: lab_sodino_jnitest_MainActivity
* Method: getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_education_bbk_com_myapplication_TestJJ_getString
(JNIEnv * env, jobject jObj){
LOGE("log string from ndk.");
return (*env)->NewStringUTF(env,"Hello From JNI!");
}
#ifdef __cplusplus
}
#endif
#endif
7.buid后,我们发现已经生成了so包,然后在代码中加载库:
static {
System.loadLibrary("JniTest");
}
image
image
网友评论