设置支持jni
在gradle.properties中添加
android.useDeprecatedNdk=true
在local.properties中添加
ndk.dir=NDK的路径
最后在app内build.gradle,在Android/defaultConfig下面添加ndk配置
moduleName表示编译出的so文件的名字
abiFilters abi接口
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion "26.0.0"
defaultConfig {
applicationId "com.example.jnitest"
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
ndk{
moduleName "JNIHello"
abiFilters "armeabi-v7a", "x86"
ldLibs "log"//实现__android_log_print
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
。。。
}
在文件中使用Log
#include <android/log.h>
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "HelloTest_TAG", __VA_ARGS__))
LOGI("hellotest_clazz 2\n");
新建java访问c层的接口类
创建一个Jni的工具类,并定义接口函数,函数关键字用native(static用不用均可)
package com.example.jnitest;
public class JniUtils {
static {
System.loadLibrary("JNIHello");
}
public static native String getHello();
}
生成头文件
"make-project"编译完成
生成头文件
cd app/build/intermediates/classes/debug/
javah com.example.jnitest.JniUtils
创建jni开发的文件夹
点击app文件夹,New → Folder → JNI Folder, 选择在main文件夹下即可,生成成功后main目录下会出现一个jni的文件夹
找到刚才生成到头文件,复制到jni文件夹下(记得关闭刚才使用的终端,否则无法复制)
头文件有了,现在在jni目录下创建一个C++文件用于开发使用,命名与头文件相同
编写C++文件中定义函数的代码
#include "com_example_jnitest_JniUtils.h"
JNIEXPORT jstring JNICALL Java_com_example_jnitest_JniUtils_getHello(JNIEnv *env, jclass clazz){
return env->NewStringUTF("Hello World");
}