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
然后将以上文件使用javac编译,然后使用javah命令,如下:
javac test/jni/TestJNI.java
javah test.jni.TestJNI
之后会得到一个test_jni_TestJNI.h的头文件,内容如下:
test_jni_TestJNI.h
然后编写c/c++实现,如下:
TestJNI.c
使用VC编译成TestJNI.dll,编译是需要引入jre/include文件夹和jre/include/win32文件夹。
将TestJNI.dll拷贝至刚才test.jni.TestJNI的classpath下面,然后运行java test.jni.TestJNI就能得到输出了,一些在编写C程序时遇到的问题都在c代码中注释了,希望能给遇到同样问题的朋友一个借鉴。
首先需要写一个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代码中注释了,希望能给遇到同样问题的朋友一个借鉴。
相关文章推荐
- JNI(Java Native Interface)技术在嵌入式软件开发中的应用
- 用Delphi开发JNI(Java+Native+Interface)应用
- JNI(Java Native Interface)首次使用
- 『阿男的技术分享』*Java Native Interface(下)*
- 关于android中AsyncTask和jni技术简单应用--附源码
- 【Java Native】【JNI技术的实践(使用VS2010)】
- Java Native Interface——JNI
- Simple example of using the Java Native Interface(JNI)
- Java Interface接口的简单应用
- JNI:Java Native Interface
- Java Programming Tutorial Java Native Interface (JNI)
- JNI_Java Native Interface
- JNI - Java Native Interface
- Java Native Interface Specification(JNI)
- 『阿男的技术分享』*Java Native Interface(上)*
- JNI (java native interface)入门:为什么用JNI
- Java Native Interface Specification(JNI)
- 业务、架构、技术,我们应该关注什么 Java和.Net的优势劣势简单看法 市场经济决定,商业之道即是软件之道,市场的需求决定着软件技术的发展 利益决定着选择应用新技术
- Ubuntu Feisty 下开发 JNI 应用步骤 (Java调用C/C++的技术)
- java native interface JNI 简介、基本原理