学习NDK开发的过程中查找了很多资料很多博客,也实验了很多次,觉得还是自己整理一下比较好。
省略部分:添加一个button设置监听用于调用native方法。。。
开始—–
1、先配置一下NDK环境
2、添加一个专门放native方法的类NativeUtils以及相应要调用的native方法
public class NativeUtils {
public static native String javaCallC();
}
3、rebuild一下工程
4、确认下是否生成了debug文件夹,路径:app/build/intermediates/classes/debug
如果没有再rebuild一下
5、打开Terminal,cd到debug目录下(或者直接把debug拖进去就直接进到该目录了)。
然后打入命令
//javah -jni 包名.类名
javah -jni com.example.jnidemo.NativeUtils
如果不成功检查下java环境配置
6、在debug目录下会生成.h文件(com_example_jnidemo_NativeUtils.h)
然后在app/src/main目录下建jni文件夹
再然后把com_example_jnidemo_NativeUtils.h文件复制到jni文件夹中
7、在gradle.properties文件中加上
android.useDeprecatedNdk=true
8、再rebuild一下工程试一下
如果出现不能删除debug文件什么的
那是因为刚刚输入javah -jni的那个窗口还占用了debug文件夹的资源,把刚刚那个命令窗口关掉再试试,如果还不能解决,关掉工程重新开下再试试。。。这个问题我遇到了3次。。终于在第三次基本上确定是这个问题。。
9、在jni文件夹中创建一个MyNative.c的文件
先导入刚刚生成的头文件,然后对里面的方法做些修改,如下
#include "com_example_jnidemo_NativeUtils.h"
/*
* Class: com_example_jnidemo_NativeUtils
* Method: javaCallC
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_jnidemo_NativeUtils_javaCallC
(JNIEnv * env, jobject obj);{
return (*env)->NewStringUTF(env,"java调用C");
}
上面是C调用java的方法,格式:Java_packageName_className_MethodName
10、在主module的build.gradle中添加so文件生成配置
android {
...
defaultConfig {
...
ndk {
moduleName "MySo"//生成的so名字
abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库
}
...
}
...
}
如果不写abiFilters,那么就会生成所有平台的so文件,写了就只会生成指定平台的so文件。
11、回到NativeUtils类,添加加载so文件代码
static {
System.loadLibrary("MySo");//要和build.gradle里面设置的so名字一致
}
12、然后编译,应该没问题了。
生成的so文件在app\build\intermediates\ndk\debug\lib目录下