以下代码摘自网络一片文章,我只是加入更多的说明,方便一些入门的朋友。

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.cppblog.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目录下即可。



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理