以下代碼摘自網絡一片文章,我只是加入更多的說明,方便一些入門的朋友。
luther@gliethttp:~/jni$ vim jusbhid.java
package gliethttp.usb.usbhid; // 使用打包命令package,將jusbhid類打包到gliethttp.usb.usbhid中.
public class jusbhid
{
public native String usbhid_open(int vid, int pid);
public native String usbhid_sendstring(String id, String command);
static {
System.loadLibrary("usbhid");
}
}
luther@gliethttp:~/jni$ javac jusbhid.java -d . // 將會在當前目錄生成包路徑gliethttp/usb/usbhid文件夾,如果沒有定義-d .那么將直接在當前目錄生成jusbhid.class
//沒有實際作用,提示用
luther@gliethttp:~/jni$ tree gliethttp/
gliethttp/
`-- usb
`-- usbhid
`-- jusbhid.class
2 directories, 1 file
//這里一定要記住要退到gliethttp根目錄上一層,如果你還在gliethttp/usb/usbhid/目錄里面的話運行會報錯。
luther@gliethttp:~/jni$ cd ../../../
luther@gliethttp:~/jni$ javah gliethttp.usb.usbhid.jusbhid // 生成jni頭文件.h
luther@gliethttp:~/jni$ ll gliethttp_usb_usbhid_jusbhid.h // 頭文件名為gliethttp_usb_usbhid_jusbhid.h
-rw-r--r-- 1 luther luther 788 2009-07-31 12:38 gliethttp_usb_usbhid_jusbhid.h
luther@gliethttp:~/jni$ vim gliethttp_usb_usbhid_jusbhid.h // 可以看到有如下內容,這里來看,加入package gliethttp.usb.usbhid;

/**//* DO NOT EDIT THIS FILE - it is machine generated */ // 與直接定義public class gliethttp_usb_usbhid_jusbhid效果一樣
#include <jni.h> // 類名中符號'_'表示包路徑.

/**//* Header for class gliethttp_usb_usbhid_jusbhid */

#ifndef _Included_gliethttp_usb_usbhid_jusbhid
#define _Included_gliethttp_usb_usbhid_jusbhid
#ifdef __cplusplus

extern "C"
{
#endif

/**//*
* Class: gliethttp_usb_usbhid_jusbhid
* Method: usbhid_open
* Signature: (II)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_gliethttp_usb_usbhid_jusbhid_usbhid_1open
(JNIEnv *, jobject, jint, jint);


/**//*
* Class: gliethttp_usb_usbhid_jusbhid
* Method: usbhid_sendstring
* Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_gliethttp_usb_usbhid_jusbhid_usbhid_1sendstring
(JNIEnv *, jobject, jstring, jstring);

#ifdef __cplusplus
}
#endif
#endif

luther@gliethttp:~/jni$ vim jusbhid.c
// [luther.gliethttp] -- 20090731
#include <stdio.h>
#include "gliethttp_usb_usbhid_jusbhid.h"

JNIEXPORT jstring JNICALL Java_gliethttp_usb_usbhid_jusbhid_usbhid_1open(JNIEnv *env, jclass obj, jint vid, jint pid)


{
char buf[512];
printf("vid=0x%04x pid=0x%04x\n", vid, pid);
sprintf(buf, "0#1#2#3#4#5\n");
return (*env)->NewStringUTF(env, buf);
}

JNIEXPORT jstring JNICALL Java_gliethttp_usb_usbhid_jusbhid_usbhid_1sendstring(JNIEnv *env, jclass obj, jstring id, jstring command)


{
int fd;
const char *idv;
const char *commands;
idv = ((*env)->GetStringUTFChars)(env, id, 0);
commands = ((*env)->GetStringUTFChars)(env, command, 0);
fd = atoi(idv);
printf("[%d] %s\n", fd, commands);
return (*env)->NewStringUTF(env, "usbhid_sendstring ok!\n");
}

//上面創建好.h和.c文件后就要編譯成.so的動態庫了
luther@gliethttp:~/jni$ gcc -fPIC -I /home/xxx/jdk1.6.0_14/include -I /home/xxx/jdk1.6.0_14/include/linux -shared -o libusbhid.so jusbhid.c
//如果遇到環境問題,就看一下http://www.shnenglu.com/noswimfish/archive/2010/12/07/135662.html//下面我們要寫一個java的例子來測試我們生成JNI接口
luther@gliethttp:~/jni$ vim usbhid_jni_example.java
import gliethttp.usb.usbhid.*; // 導入CLASSPATH搜索路徑中,路徑為gliethttp/usb/usbhid/下的所有.class包
public class usbhid_jni_example


{
public static void main(String[] args)

{
String rets;
jusbhid hid = new jusbhid();
rets = hid.usbhid_open(0x1234,0x5678);
System.out.printf("%s", rets);
rets = hid.usbhid_sendstring("88", "QWS\r");
System.out.printf("%s", rets);
}
}

luther@gliethttp:~/jni$ javac usbhid_jni_example.java
//這里可能遇到編碼問題,你可以適當的用下面的方式解決
luther@gliethttp:~/jni$ javac -encoding gbk usbhid_jni_example.java
//其中具體采用哪種編碼根據的example中的例子的編碼來覺得,我只舉了一個gbk的例子,還有很多可以從網上查查。
//執行程序
luther@gliethttp:~/jni$ java usbhid_jni_example
vid=0x1234 pid=0x5678
0#1#2#3#4#5
[88] QWS
usbhid_sendstring ok!
//執行可能會出一些問題,可能找不到你之前生成 .so JNI動態庫,你可以把動態庫拷貝到/usr/lib目錄下即可。