Java原生JNI的使用、javah指令的使用以及图解教材
来源:互联网 发布:js 去掉换行符 编辑:程序博客网 时间:2024/06/02 05:29
Java Nativie Interface(JNI,中文名称Java本地接口)标准时Java平台的一部分,它允许Java代码和其他语言写得代码进行交互。JNI是本地编程接口,它使得Java虚拟机(VM)内部运行的Java代码能够用其他编程语言(如C、C++和汇编语言)编写的应用程序和库进行交互操作。JNI的主要用途是为了对硬件进行访问以及追求高效率或可重用C/C++库。
Android系统中采用了JNI的方式来调用C/C++方法,然而,在Android系统里进一步加强了Java JNI的使用,使JNI的调用更具有效率。因此,总的来说,Android系统里可以采用两种方式来使用JNI。第一种:Java原生JNI,使用dll等动态链接库 ;第二种,Android加强版JNI,通过动态加载*.so链接库来进行JNI调用。今天,我们分析第一种JNI使用方式,也称得上是JNI入门。
由于Java与其他编程语言采用的语法不同,为了让Java与C/C++库函数能进行通信,约定的一个参数类型映射如下:
Java类型 C/C++类型
void void
jboolean boolean
jint int
jlong long
jdouble double
jfloat float
jbyte jbyte
jchar char
jshort shor
上面的只是简单类型的一个映射,后面我们会完善其他参数类型的映射。
开发环境介绍(Windows下):
Eclipse: 主要用来创建Java工程
MicrosoftVC++6.0: 生成动态链接库供相应的Java文件加载
一、使用Eclipse创建Java工程
本例中,我们简单的创建了一个Java工程HelloBabyJNI,工程绝对路径位于E:\MyCode\AndroidCode\HelloBabyJNI路径下, 主文件路径位于\src\lover\hellojni路径下(路径对后面的javah编译很重要)
HelloBabyJNI.java文件如下:
2,编译HelloBabyJNI.java文件,生成HelloBabyJNI.class文件,位于路径\src\lover\hellojni\HelloBabyJNI.class
3,使用javah指令编译HelloBabyJNI.class文件,生成Java与C/C++之间进行通信的约定接口,它规定了Java中nativemethod在C/C++的具体接口。运行cmd后,进入于E:\MyCode\AndroidCode\HelloBabyJNI\src路径下,使用javah指令,指令集形式如下:
javah -classpath E:\MyCode\AndroidCode\HelloBabyJNI\src -jni com.lover.hellojni.HelloBabyJNI,具体指令用法可以参考javah –help,本文只是重应用上。
如图所示:
成功运行后,我们可以在src文件夹下找到com_lover_hellojni_HelloBabyJNI.h文件,这个文件就是我们需要找到的约定接口,它 的命名规范为 包名_Java文件名。为了可理解性,我们将其重命名为HelloBabyJNI.h文件,内容如下:
PS:1, 由于-jni指令在javah中是默认选项,因此我们可以忽略掉它
2,在Dos中, .代表当前路径,也就是E:\MyCode\AndroidCode\HelloBabyJNI\src,我们可以简单的使用 . 来指定当前路径
于是,一个简约的javah指令如下所示:
此外,我们还可以在工程menu的bin文件夹下来执行javah指令,只需要将上面的bin替换src则可。当然,最后生成的.h文件在bin文件夹下。
二、使用MS VC生成dll动态链接库:
1,创建DLL工程,如同所示:
2,下一步,选择A simple DLL project
3,接下来,生成了我们的HelloJNI工程,切换至File View视图
首先,导入我们之前生成的HelloBabyJNI.h头文件(可能我的VC环境有问题,我在这儿新建了一个HelloBabyJNI.h文件,拷 贝了我们之前通过javah生成的.h的文件内容)
第 二,在StdAx.h文件添加如下需要引用的头文件:
第三,在HelloBabyJNI.cpp中添加我们的native method的方法实现,并且加入相应的形参。
- Java原生JNI的使用、javah指令的使用以及图解教材
- Android中JNI的使用之一:Java原生JNI的使用、javah指令的使用以及图解教材
- android JNI javah的使用
- Jni使用javah导出h文件,以及native函数不能导出的bug
- 使用javah和javap得到JNI接口的签名
- Android JNI学习之javah命令的正确使用 转
- 使用javah和javap得到JNI接口的签名
- 正确使用javah命令生成JNI的头文件
- Android JNI学习之javah命令的正确使用
- IDEA开发,Jni中javah使用方式的探索
- javah命令的使用
- javah的使用
- java项目中Javah的使用
- Java JNI之javac javah的用法
- JNI和javah使用详解
- Android JNI javah 命令使用
- maven的使用教材
- javah命令的使用记到起哥老忘
- 更好的学习与记忆
- Spring注解@Component、@Repository、@Service、@Controller区别
- CNN文本分类 论文收集
- 深度学习Deeplearning4j 入门实战(2):Deeplearning4j 手写体数字识别Spark实现
- iOS常用的宏
- Java原生JNI的使用、javah指令的使用以及图解教材
- 单向循环链表
- 目标检测--Accurate Single Stage Detector Using Recurrent Rolling Convolution
- 查看应用包名,am start 启动
- SOAPUI 安装及破解
- 深度学习Deeplearning4j 入门实战(3):简介Nd4j中JavaCPP技术的应用
- 断言模式
- SQL function函数示例
- 推荐系统概述6