Android Studio下NDK开发
AS下NDK开发步骤:
配置NDK
生成class文件
生成.h头文件
*gradle配置
测试
配置NDK
-
在这里配置好下载的NDK,并在local.properties生成
ndk.dir=E:\\Tools\\android-sdk-windows\\ndk-bundle
生成class文件
新建JNITest.java实现native方法
public class JNITest {
static { //载入名为“Test”的C++库
System.loadLibrary("Test");
}
public native int add(int a, int b);
public native double mulDouble(double a, double b);
}
然后build->make project会在app/build下生成classes,如果没有请重试
生成.h头文件
有了class文件就可以生成 .h头文件了
- 打开Terminal输入指令
cd app/build/intermediates/classes/debug
javah -jni com.harry.test.ndk.JNITest
这里javah -jni后面跟的是JNITest类的全路径,如果javah报不存在之类的,是你的java环境没有配置好。
打开classes/debug下面的文件发现多了一个文件
com_harry_test_ndk_JNITest.h然后在src/main下新建文件夹jni,把生成的.h文件复制或者剪切到jni文件夹下面去,新建一个c类随便取一个名字 如 myjni.cpp(NEW->C/C++ Source File),添加代码如下
#include "com_harry_test_ndk_JNITest.h"
JNIEXPORT jint JNICALL Java_com_harry_test_ndk_JNITest_add
(JNIEnv *env, jobject obj,jint a,jint b){
return a+b;
}
JNIEXPORT jdouble JNICALL Java_com_harry_test_ndk_JNITest_mulDouble
(JNIEnv *env, jobject obj,jint a,jint b){
return a*b;
}
gradle配置
- gradle.properties
android.useDeprecatedNdk=true
- build.gradle
ndk {
moduleName "Test" //生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库,目前可有可无。
}
测试
JNITest jni = new JNITest();
int res=jni.add(10, 20);
Log.e("TestJNI", "10+20=" + res);
double r=jni.mulDouble(10.88, 20.0);
Log.e("TestJNI", "10.88*20.0=" + r);
到此,简单的ndk开发结束了
补充
在JNITest.java添加native方法,需重新生成class文件
打开app->intermediates-ndk-debug发现生成了三个文件夹,并且对应了之前我们在build.gradle配置的abiFilters,将该三个文件夹放入app/libs,删除jni文件夹试试
PS:处理非基本数据类型
- 处理java String对象
native 方法
public native String getStr(String str);
JNIEXPORT jstring JNICALL Java_com_harry_test_ndk_JNITest_getStr
(JNIEnv *env, jobject, jstring str){
//获得string对象
const char *nativeString = env->GetStringUTFChars(str, 0);
//DON'T FORGET THIS LINE!!!
//释放string对象
env->ReleaseStringUTFChars(str, nativeString);
return str;
}
- 处理java int[] 数组
native 方法
public native int[] convert(int[] ids);
JNIEXPORT jintArray JNICALL Java_com_harry_test_ndk_JNITest_convert
(JNIEnv *env, jobject, jintArray array) {
jint buf[10];
jint i;
env->GetIntArrayRegion(array, 0, 10, buf);
jint j = 0;
//元素 平方值输出
for (i = 0; i < 10; i++) {
j = buf[i];
j *= j;
buf[i] = j;
}
env->SetIntArrayRegion(array, 0, 10, buf);
return array;
}