Java 之 JNI 初步认识
3、利用 javah -jni 命令把 HelloJNI.class 生成头文件,如:com_java_jni_HelloJNI.h ?(注意如果有包的关系存在的时候,javah -jni com.java.jni.HelloJNI)
接下来就是写 C 程序代码了,我们可以看到在生成 的 HelloJNI.h 头文件中,也声明了我们刚刚在 HelloJNI.java 里用 native 声明的所有函数,我们这里写 C 代码就必须实现这些头文件中声明了的函数
4、在 eclipse 或 vs 创建一个 C 工程,把刚刚生成的 HelloJNI.h 文件拷贝到工程目录,并导入,接下来再创建一个 C 程序,根据头文件里的方法声明写方法实现。
C 代码:
#include <stdio.h>
#include <stdlib.h>
#include "jni.h"
#include "com_java_jni_HelloJNI.h"
/*
Class: com_java_jni_HelloJNI
Method: sayHello
Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_java_jni_HelloJNI_sayHello
(JNIEnv *env, jobject obj){
printf("hello c");
}
5、方法实现之后,你会发现 C 程序提示有错,那是因为在方法实现的时候,许多字段没有声明,系统不认识,那就需要包含 jdk 给我们提供的一个数据转换的接口(存在于 jdk 目录下面的 include/jni.h 文件中),把 jni.h 文件拷贝到 C 工程的根目录,在 C 程序中包含 jn
i.h 如下:
#include"jni.h",这个时候,我们不能用"<jni.h>"了(自己理解区别),其实我们在自动生成的 com_java_jni_HelloJNI.h 文件中也是使用 #include<jni.h>,这样同样系统会提示出错,所以也必须改过来
6、编译生成 dll 或 so 文件,用 vs 的话,在创建的时候,需要选择 dll 和空工程,这样在 build 的时候,在 debug 下面会生成一个 dll 文件 ,这就是我们需要的动态链接库文件
如果我们使用的是 eclipse 这时候,我们可以用命令来编译:
我用的是 eclipse+minGW,所以这里我们用 gcc 命令来编译:进入到 C 程序所在的目录然后用下面命令来编译
gcc --share -Wl,--kill-at -o HelloJNI.dll HelloJNI.c ?
或者
gcc --share -o HelloJNI.dll HelloJNI.c
注意这个命令不能用任何空格,开始的时候我就是在--kill-at 前面有一个小小空格,找死我了,呵呵……
7、这样我们在 C 程序所在的目录下面得到了我们需要的 dll 文件,动态链接库文件
8、将生成的 dll 文件加入到环境变量中,或创建的 java 工程目录中,用 System.loadLibrary("dll 文件名,不包含后缀");放在 static 块中,加载 dll 文件。这样我们就可以像调用 java 方法一样调用被 native 声明的方法了,当然实际运行的是我们在 C 程序中实现了的代码。代码如下:
package com.java.jni;
public class HelloJNI {
public native String sayHello();
static {
评论