Android Studio NDK开发之一(Java调用C的方法)

来源:互联网 发布:a站 b站 知乎 编辑:程序博客网 时间:2024/06/04 19:30

学习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目录下
这里写图片描述


DEMO:http://download.csdn.net/detail/lang523493505/9683024

0 0