JNI开发流程

来源:互联网 发布:动态图修改软件 编辑:程序博客网 时间:2024/06/06 04:00

前言:现在越来越多的java或者安卓项目都用到jni了,通过jni把耗时操作方法用C/C++可以提高java运行效率,还可以通过jni把重要的业务逻辑放到c/c++去实现,c/c++反编译比较困难,安全性较高!ok,今天我们就一起来学习jni!如果你对C语言不是那么熟悉的话,欢迎请看我的《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语言不太熟悉的话,请移步我的博客《C语言系列博客》 

《C语言快速讲解(一) 》

《C语言快速讲解(二)指针的用法》

《C语言快速讲解(三)动态内存分配》

《C语言快速讲解(四)字符串的相关操作》

《C语言快速讲解(五)结构体与指针》

《C语言快速讲解(六)联合体、枚举、IO》

《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++以后在详细讲解!

------------------完!-----------------

原创粉丝点击