本文共 1835 字,大约阅读时间需要 6 分钟。
前言:现在越来越多的java或者安卓项目都用到jni了,通过jni把耗时操作方法用C/C++可以提高java运行效率,还可以通过jni把重要的业务逻辑放到c/c++去实现,c/c++反编译比较困难,安全性较高!ok,今天我们就一起来学习jni!如果你对C语言不是那么熟悉的话,欢迎请看我的《》 !
-------------分割线------------
什么是JNI:全称是java native interface native,翻译过来就是Java本地接口。通过JNI可以实现java和本地代码之间相互调用,实际上就是一套协议!
为什么要用JNI:1.Java 一处编译到处运行
2.java运行在虚拟机上 JNI可以扩展java虚拟机的能力 让java代码可以调用驱动
3.java是解释型语言 运行效率相对较低 C/C++的效率要高很多 通过jni把耗时操作方法C/C++可以提高java运行效率
4.java代码编译成的.class 文件安全性较差, 可以通过jni 把重要的业务逻辑放到c/c++去实现,c/c++反编译比较困难 安全性较高
5.C历史悠久 1972年C 通过JNI可以调用优秀的C开源类库
---------------分割线---------------
如果你对C语言不太熟悉的话,请移步我的博客《》
《 》
《》
《》
《》
《》
《》
《》
-----------------分割线-----------------
1.在eclipse新建一个项目,项目只有一个文件,看下图:
2.在TestJni.java中编写javanative方法:
package com.fly;public class TestJni { public native String getCString(); public static void main(String[] args) { }}3.生成对应的C头文件(xx.h):
输入完成后会在src目录下生成对应的XXX.h文件,生成的文件命名也很有规则:包名类名方法名.h
然后刷新eclipse:
4.打开文件看核心代码:
JNIEXPORT jstring JNICALL Java_com_fly_TestJni_getCString (JNIEnv *, jobject);这个看起来很眼熟吧?就是我们刚才java写的对应c方法函数声明,其命名规则如下 Java_包名_类名(JNIEnv *,jobject,参数…).
5.创建对应C项目:
然后把,h复制到头文件项目里:
接着在项目中添加头文件:
然后接着把两个jni.h和jni_mk.h用同样的方式导入头文件:(xx\Java\jdk1.8.0_111\include和xx\Java\jdk1.8.0_111\include\win32下)
然后把com_fly_TestJni.h里面的引入符号改成双引号:
6.C代码编写函数:在源文件中创建一个01.c:
#include"com_fly_TestJni.h" JNIEXPORT jstring JNICALL Java_com_fly_TestJni_getCString(JNIEnv *env, jobject jobj){ //用结构体的方法 生成对应java的字符串返回 return (*env)->NewStringUTF(env, "这个是来自C语言");}JNIEnv *env 一个及其重要的参数 Env 是environment(环境)缩写,那么直接翻译就是 java本地接口环境,本质是一个结构体指针,在c环境是2级指针,在c++是一级指针(后面详解为什么有区别,先简单了解c++有this关键即可). env保存的结构体内含多种实现好的方法,和java和c语言基本数据类型转换和生成String字符串等。
7.生成动态链锯库:
在windows中是dll文件, 在Linux是so文件
然后生成dll:
8.Java加载动态库:
ps:如出现乱码,请先设置vs为utf-8,然后重新生成,在导入eclipse中
------------------分割线---------------
关于env的一级指针和env的二级指针,以后讲到C++以后在详细讲解!
------------------完!-----------------