下面是一个JNI例子,调用C++输出"hello":
第一步:创建Java类,在里面定义一个本地方法(用native关键字修饰的方法),在类中的静态初始化块中通过System.loadLibrary方法加载名为hellotest的原生代码库,注意hellotest为后面生成的hellotest.dll的文件名。
class Hello{
static{
System.loadLibrary("hellotest");
}
public native void say();
}
第二步:使用javah命令(javah 类的全路径)生成本地方法的C/C++头文件,在DOS窗口中
文件所在目录,先对javac Hello.java进行编译,然后执行javah Hello命令,执行完之后就会在当前目录生成一个后缀名为.h的头文件,如hello.h。
注意:将生成的#include <jni.h>改成#include "jni.h",并将jni.h和jni_md.h文件放在和编写C/C++本地代码路径下,或者不修改#include <jni.h>,直接将jni.h和jni_md.h文件放到gcc编译器相应的类库路径下,jni.h文件在JDK中的include目录下,jni_md.h文件在JDK中的include目录中的win32中。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "jni.h"
/* Header for class Hello */
#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Hello
java创建文件 * Method: say
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Hello_say
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
Java_Hello_say是对Hello类中的本地方法say()的声明。这个件相当于我们在java里面的接口,这里声明了一个 Java_Hello_say (JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致。
第三步:编写C/C++本地代码,生成动态链接库文件
#include "test.h"
#include "stdio.h"
JNIEXPORT void JNICALL Java_Hello_say
(JNIEnv *, jobject){
printf("hello\n");
}
在DOS窗口中进入文件所在目录下,生成动态链接库文件:
gcc test.c -shared -o hellotest.dll -Wl,--kill-at
第四步:Java调用本地函数
class Test{
public static void main(String[] args){
System.out.println("start");
new Hello().say();
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论