您的位置:首页 > 编程语言 > Java开发

java native interface(JNI)技术简单应用

2009-09-23 14:24 489 查看
      手上一个项目需要通过usb口去读取usbkey的信息,厂家提供的只有C/C++的接口,而主应用是java的,所以需要使用java去调用动态链接库,所以花了点时间研究了下JNI技术,jdk对JNI技术封装得很到位,使用起来非常简单,JNI技术最关键还是在于jni数据类型和本地数据类型的转换。先简单罗列下JNI的创建过程:

      首先需要写一个java类,然后定义需要使用C/C++去实现的方法(虽然说jni是java native interface,但是目前只支持c/c++实现),使用native关键字声明。这里写一个简单的例子:

TestJNI.java

package test.jni;

public class TestJNI
{

static
{
System.loadLibrary("TestJNI");
//这个是之后产生的库的名字,不需要加后缀,
//自动根据系统找.dll或者.so;
}

public native String helloWorld();

public static void main(String[] args)
{
TestJNI t = new TestJNI();
System.out.println(t.helloWorld());
}
}


然后将以上文件使用javac编译,然后使用javah命令,如下:

javac test/jni/TestJNI.java

javah test.jni.TestJNI

之后会得到一个test_jni_TestJNI.h的头文件,内容如下:

test_jni_TestJNI.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class test_jni_TestJNI */

#ifndef _Included_test_jni_TestJNI
#define _Included_test_jni_TestJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     test_jni_TestJNI
* Method:    helloWorld
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_test_jni_TestJNI_helloWorld
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


然后编写c/c++实现,如下:

TestJNI.c

#include <stdio.h>
#include <jni.h>
#include <windows.h>

#include "test_jni_TestJNI.h"

JNIEXPORT jstring JNICALL Java_test_jni_TestJNI_helloWorld
(JNIEnv * env, jobject object){
//在c中必须给形式参数声明变量名,C++中可以不用,头文件中不需要修改;
const char* str = "helloWorld";
return (*env)->NewStringUTF(env,str);
//C++中可以直接env->NewStringUTF(str),这个函数编码中文会乱码;

}


使用VC编译成TestJNI.dll,编译是需要引入jre/include文件夹和jre/include/win32文件夹。

将TestJNI.dll拷贝至刚才test.jni.TestJNI的classpath下面,然后运行java test.jni.TestJNI就能得到输出了,一些在编写C程序时遇到的问题都在c代码中注释了,希望能给遇到同样问题的朋友一个借鉴。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息