JNI开发笔记一

1、创建一个类,在类里面声明一个本地方法
public class JNIUtils { 
    //在c语言中对两个数求和   
    public static native int getNumSum(int a ,int b);
}

2、设置ndk的路径和.so的名称

  • 点击File->ProjectStructure,配置好ndk的路径(最好是先把ndk下载到本地)如下图:
JNI开发笔记一_第1张图片
ndk_config.png
  • 在模块的目录下找到build.gradle文件,将以下部分

    ndk{  
            //.so的名称:testjni  
            moduleName"testjni" 
            //适配了三种平台,一般armeabi平台比较多,可以只写一种   
            abiFilters"armeabi","armeabi-v7a","x86"
    }
    

添加到defaultConfig大括号内

  • 在grade.properties文件内的末尾处添加一句代码,不然studio会报错

    android.useDeprecatedNdk=true
    

3、生成头文件

  • 先点击Build->Make Project,再打开模块目录下的build文件夹,会生成一个文件夹classes,点击打开,找到一个debug的文件夹

  • 打开studio的Terminal,先进入到debug文件夹中,输入:

    cd app/build/intermediates/classes/debug
    
  • 再输入:

    //javah -jni 类的全名
    javah -jni com.blainpeng.jnidemo.JNIUtils
    

此时会在debug文件下生成一个.h文件

4、java层开始调用c/cpp中的函数

  • 在main目录下新建一个名为jni的文件夹,然后jni目录下新建一个.c或.cpp文件,将上面生成的.h文件中的方法剪切到jni目录下,并且在.c/.cpp里面include该头文件

    #include "com_blainpeng_jnidemo_JNIUtils.h"
    //c中求和的方法 
    int sum(int a, int b){    
            return a+b;
    }
    JNIEXPORT jint JNICALL Java_com_blainpeng_jnidemo_JNIUtils_getNumSum        
    (JNIEnv *env, jclass clazz, jint ja, jint jb){    
          return sum(ja,jb);
    }
    
  • 写完逻辑后,再rebuild一次,再次点击build->intermediates,找到一个ndk的文件夹,点击它,查看是否有生成.so文件

  • 在android代码中调用本地方法,需先加载so文件,可以通过静态代码块的方式来加载

      static {    
                  System.loadLibrary("testjni");
       }
    
  • 再调用本地方法:

      int numSum = JNIUtils.getNumSum(4, 9);
    

得到结果:

JNI开发笔记一_第2张图片
result.png

好了,JNI的简单入门就结束了。

你可能感兴趣的:(JNI开发笔记一)