JAVA JNI 使用实例

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

关于Zeno Chen

本人涉及的领域较多,杂而不精 程序设计语言: Perl, Java, PHP, Python; 数据库系统: MySQL,Oracle; 偶尔做做电路板的开发,主攻STM32单片机
此条目发表在C/C++分类目录。将固定链接加入收藏夹。