JNI开发流程

前言:现在越来越多的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++以后在详细讲解!

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

等待着冬天的风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值