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++以后在详细讲解!
------------------完!-----------------
- JNI笔记 JNI开发流程
- android jni 开发流程
- Android JNI开发流程
- jni开发流程
- JNI开发流程
- JNI开发流程
- android jni开发流程
- JNI开发流程
- JNI的开发流程
- jni开发流程
- JNI开发流程
- Android JNI开发流程
- NDK开发 - JNI开发流程
- Android JNI学习之---JNI开发流程
- android 串口jni 开发流程
- 【JNI】开发流程6步骤
- JNI入门 NDK开发流程
- Android--JNI的开发流程
- 常用网址
- JDK1.8 动态代理机制及源码解析
- TCP协议以及其报头结构分析
- 腾讯笔试题--微信红包
- 递归删除一个文件夹
- JNI开发流程
- Spring 源码之 BeanDefinition阅读
- SpringMvc的DispatcherServlet和Control的线程安全问题
- DFS、栈、双向队列:CF264A- Escape from Stones
- NGUI 类皇室战争(CR)的滚动列表效果完整实现(四)
- hdu 2962 Trucking(二分+最短路)
- POJ 1020 Anniversary Cake(dfs+分割思想)【转】
- 有意思的程序员
- hdu 1254 推箱子 (bfs+dfs+预处理)