JAVA可以通过JNI接口访问本地的动态连接库,从而扩展JAVA的功能。使用JAVA JNI接口主要包括以下步骤:
(1)编写JAVA代码,注明要访问的本地动态连接库和本地方法;
(2)编译JAVA代码得到.class文件;
(3)使用javah -jni 生成该类对应的C语言.h文件;
(4)使用C/C++实现(3)生成的.h文件中声明的各函数;
(5)编译C/C++实现代码生成动态连接库。
本文使用一个简单的helloWorld示例演示JNI的使用。
(1)编写JAVA代码
public class HelloJNI { static { System.loadLibrary("Hello"); } public static native void hello(String msg); public static void main(String[] args) { HelloJNI hh=new HelloJNI(); hh.hello("Hello,Kimm!"); } }
(2)编译JAVA代码
javac HelloJNI.java
(3)生成实现函数头文件
cd [classes] javah -classpath . org.magicwall.HelloJNI
生成HelloJNI.h文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */ #include/* Header for class HelloJNI */ #ifndef _Included_HelloJNI #define _Included_HelloJNI #ifdef __cplusplus extern "C" { #endif /* * Class: HelloJNI * Method: hello * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_HelloJNI_hello (JNIEnv *, jclass, jstring); #ifdef __cplusplus } #endif #endif
方法声明中需注意:jclass表示HelloJNI那个类,jstring表示hello方法参数类型
(4)编写C文件
#include "jni.h" #include#include "HelloJNI.h" JNIEXPORT void JNICALL Java_HelloJNI_hello(JNIEnv *env, jclass aa, jstring bb) { printf("hello,world\n"); return; }
**** 这是JNI的关键:通过env我们可以使用JAVA提供的一组函数操作与转换函数传递的参数。
(5)生成dll:
x86_64-w64-mingw32-gcc -I $JAVA_HOME/include -I $JAVA_HOME/include/win32 -shared -Wl,--kill-at -o OpenSSL.dll org_magicwall_utils_sign_OpenSSL.c
System.loadLibrary(“Hello”);就是加载生成的dll文件,注意名字一样
(6)运行 java HelloJNI,调用c文件中的Java_HelloJNI_hello方法
===================================
附:如何操作与返回JAVA的参数与类型,这篇文章有些实际的例子可供参考:
http://blog.sina.com.cn/s/blog_548cc485010005ct.html