简介

Java Jni--Java Native Interface(Java本地接口),Jni是为了方便Java调用C、C++等本地代码所封装的一层接口。

NDK--Android提供的一个工具集合,通过Ndk可以在Android中更加方便的通过JNI来访问本地代码,比如C、C++。

在开发之前需要配置的地方

● 下载NDK工具,地址:http://www.androiddevtools.cn/,下载完成之后配置。

● gradle.properties文件末尾添加 android.useDeprecatedNdk=true

● 在build.gradle文件的defaultConfig内添加

         ndk {     

              moduleName "encryptMD5"//生成的so名字

               abiFilters "armeabi","armeabi-v7a","x86"//输出指定三种abi体系结构下的so库

          }


JNI开发流程(windows环境,Android studio NDK工具)

1、声明native方法

       创建一个类JniUtils,实现native方法(加密流程:传入String型参数通过C的md5算法获取加密后的值),代码如下:


public class JniUtils{

           public static native String encryptMD5(String str);

}

2、编译Java源文件得到class文件,再通过javah命令到处JNI的头文件

       在Android Studio中直接Clean Project或者Rebuild Project就可以获取class文件了,Clean Project完成后,就可以看到class文件了。


      然后再打开Android Studio Terminal输入指令:

        cd app/build/intermediates/classes/debug

      然后再输入指令:

        javah -jni com.panda.ndkdemo.JniUtils    

这时再打开classes/debug目录时,这里生成了一个com_panda_ndkdemo_JniUtils.h的头文件:


extern "C" {

#endif

/*

* Class:    com_panda_ndkdemo_JniUtils

* Method:    getInfoMD5

* Signature: (Ljava/lang/String;)Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_com_panda_ndkdemo_JniUtils_encryptMD5

(JNIEnv *, jclass, jstring);

#ifdef __cplusplus

}

#endif

#endif


3、代码说明:

函数名的格式规则 :   Java_包名_类名_方法名

例如  JNIEXPORT jstring JNICALL Java_com_panda_ndkdemo_JniUtils_encryptMD5(JNIEnv *, jclass, jstring);

com_panda_ndkdemo——包名;

JniUtils——类名;

encryptMD5——方法名;

jstring——encryptMD5方法的String类型的参数;

JNIEnv*——表示一个指向JNI环境的指针,通过它来访问JNI提供的接口方法;

JNIEXPORT和JNICALL——JNI中所定义的宏,可以在jni.h这个头文件中找到;

4、实现JNI方法:

jni方法是指Java中声明的native方法,在生成com_panda_ndkdemo_JniUtils.h头文件后,通过c或者c++来实现jni方法。

在src/main下新建文件夹jni,把生成的.h文件剪切到jni文件夹下面去,新建一个c类随便取一个名字,添加代码如下

#include "com_panda_ndkdemo_JniUtils.h"

#include

* Class:    Java_com_panda_ndkdemo_JniUtils

* Method:    encryptMD5

* Signature: ()Ljava/lang/String;

*/JNIEXPORT  jstring  JNICALL Java_com_panda_ndkdemo_JniUtils_encryptMD5(JNIEnv *env, jobject obj){

       //这里省略掉MD5的一些算法调用代码

      //具体的c语言的 MD5算法网上有很多 这里就不贴出咯O(∩_∩)O!

      return(*env)->NewStringUTF(env,"   c返回的值   ");

}


然后编译再重新build项目,再去app->intermediates-ndk-debug发现生成了三个文件夹,并且对应了之前在build.gradle配置的abiFilters,里面生成了对应的so包。

在JniUtils类添加如下代码

static{      

      System.loadLibrary("encryptMD5");//必须和在build.gradle里面设置的so名字一致

}

然后在最后调用的地方直接JniUtils.encryptMD5("");就行了

ps:如果so给其他工程调用 那么调用encryptMD5方法的包名路径和类名必须和so库一致

Next:5、JNI的数据类型和类型签名

更多相关文章

  1. LinearLayout 分割线
  2. Android(安卓)RecyclerView 详解(五) RecyclerView多布局的使用
  3. (转载)Android(安卓)耗时代码(ANR)的查找检测和分析解决 TraceView
  4. 【Based Android】Android(安卓)Sensor感应器介绍(一)重力感应加速
  5. android activity启动过程分析
  6. Android(安卓)Activity及其生命周期
  7. Android(安卓)五大存储方式详解
  8. Android中的Intent Filter匹配规则介绍
  9. 卸载SD卡对MediaServer的处理

随机推荐

  1. 如何在Linux上安装Ruby
  2. 源代码是什么
  3. C#和C ++的区别是什么
  4. 浅谈Ruby和C语言之间的异同点
  5. C#中的数据类型是什么?C#中的四种数据类型
  6. erp系统是什么
  7. Ruby是什么?Ruby的优缺点
  8. 什么是C#中的多态性?
  9. auto是什么意思
  10. 在C,C ++和C#中的Int是什么