Java native interface(JNI)技术简单应用
Java native interface(JNI)技术简单应用
手上一个项目需要通过usb口去读取usbkey的信息,厂家提供的只有C/C++的接口,而主应用是java的,所以需要使用java去调用动态链接库,所以花了点时间研究了下JNI技术,jdk对JNI技术封装得很到位,使用起来非常简单,JNI技术最关键还是在于jni数据类型和本地数据类型的转换。先简单罗列下JNI的创建过程:首先需要写一个java类,然后定义需要使用C/C++去实现的方法(虽然说jni是java native interface,但是目前只支持c/c++实现),使用native关键字声明。这里写一个简单的例子:
TestJNI.java
[java:nogutter]
- 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
[cpp]
- /* 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
[cpp]
- #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代码中注释了,希望能给遇到同样问题的朋友一个借鉴。
评论暂时关闭