Java中的JNI调用
来源:互联网 发布:淘宝分销刷销量 编辑:程序博客网 时间:2024/05/18 20:07
Java的平台无关特性使得java语言具有write once , run everywhere的巨大优势。但是,java为了可以调用其他语言(C,C++等)的动态链接库,发挥其他语言的优势,java采用JNI机制使得开发者可以调用操作系统相关实现的库函数。 其中JNI的原理图如下:
下面以一个例子对JNI调用进行说明。
1. 在Eclipse下创建工程Test, 新建类JniTest,代码如下:
package learn.JNI;public class JniTest {static{System.loadLibrary("dllName");}public native static int getSquare(int a);/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubSystem.out.println(getSquare(5));}}
在代码中,首先写入static代码块,通过System.loadLibrary("dllName"); 导入dll文件(文件的生成在后面的步骤中)。然后创建native的static方法,作为调用C++函数的接口。下面的main入口就没什么好说的了,就是对java接口的测试。
2. 采用Eclipse进行编译,或者直接用javac对文件进行编译,形成字节码。
javac learn/JNI/JniTest.java
接着对生成的字节码文件使用javah命令,生成.h文件。
javah learn.JNI.JniTest 该命令在src目录下生成文件learn_JNI_JniTest.h。 其代码如下:
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class learn_JNI_JniTest */#ifndef _Included_learn_JNI_JniTest#define _Included_learn_JNI_JniTest#ifdef __cplusplusextern "C" {#endif/* * Class: learn_JNI_JniTest * Method: getSquare * Signature: (I)I */JNIEXPORT jint JNICALL Java_learn_JNI_JniTest_getSquare (JNIEnv *, jclass, jint);#ifdef __cplusplus}#endif#endif
可以看出,javah根据java文件中的native接口,生成了.h文件中的JNIEXPORT jint JNICALL Java_learn_JNI_JniTest_getSquare(JNIEnv *, jclass, jint)方法。
3. 在Visual Studio中建立dll工程,生成相应的dll文件。
新建工程-Visual C++-Win32-Win32 Project, 然后键入工程的名字,该名字要与第一步中的loadLibrary()中的名字一致。这里,我们就命名为dllName。在后面的选择中,分别选择DLL选项和empty project选项。
点击确定后,把刚才生成的learn_JNI_JniTest.h文件放在该工程目录下。并且需要复制jdk/include/jni.h jdk/include/win32/jawt_md.h jdk/include/win32/jni_md.h到Visual Studio的安装目录Microsoft Visual Studio 9.0\VC\include下。然后创建.cpp文件,其名字任意, 这里命名为cal_func.cpp,代码如下:
#include "learn_JNI_JniTest.h"JNIEXPORT jint JNICALL Java_learn_JNI_JniTest_getSquare(JNIEnv *jni_env, jclass obj, jint a){return a*a;}
即为对.h中的函数接口的实现。
这样就可以对工程直接进行编译,最终在Debug下可以发现dllName.dll动态链接库文件。
4. 把生成的dllName.dll文件放在java工程的根目录下,这样直接运行java程序,就可以看到结果了。
- Java中的JNI调用
- JNI------Java调用C语言中的MessageBox
- java jni 调用cpp文件中的方法
- Android中的jni调用
- Android jni 使用C语言调用java中的log方法
- JNI之C语言调用Java中的方法
- JNI调用Java中的静态非静态方法
- Java JNI调用dll中的C代码的流程
- JNI开发基础篇:C语言调用Java中的方法
- java 调用dll JNI
- Mac Java Jni 调用
- JAVA-JNI调用GDAL
- java调用jni
- JNI ,C++调用java
- JNI调用Java方法
- Java调用C JNI
- java applet调用JNI
- java JNI 调用
- iOS截屏代码的问题
- 求两点间所有路径的遍历算法
- ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句
- 11.8移动弹出层到指定位置
- 网游服务器数据访问架构模式
- Java中的JNI调用
- pthread_cond_wait()使用注意点
- JDK中设计模式
- NGUI插件四 创建动态字体集
- android录像预览功能
- 现实版本《合伙人》
- Android平台Gallery2应用分析(五)---AlbumPage和DataManager
- TopCoder kawigiEdit插件配置
- Head first 设计模式 整理