你不能只使用 public native usb_init(); 然后像这样加载一个本机库,JNI 不是以这种方式实现的。
您使用 javah 创建一个 .h 文件,该文件可用于创建实现类中特定本机函数的库。
javac USBManager
创建一个与 javah 一起使用的类文件:
javah USBManager
这会在该位置生成一个名为“USBManager.h”的文件,该文件指定要在 .so/.dll 中实现的函数,以实现相关的本地函数。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class USBManager */
#ifndef _Included_USBManager
#define _Included_USBManager
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: USBManager
* Method: usb_init
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_USBManager_usb_1init
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
因此,您需要导出一个名为“Java_USBManager_usb_1init”的函数,该函数采用指定的参数。
该功能无非是:
JNIEXPORT void JNICALL Java_USBManager_usb_1init (JNIEnv *, jobject) {
usb_init();
}
Sun 开发人员的博客上有一个非常好的简单示例,但还有很多其他示例。