Java之JNI初步认识

来源:互联网 发布:安卓煲耳机软件 编辑:程序博客网 时间:2024/05/08 20:48

昨天学习了一下如何使用JAVA调用C语言程序,就是所谓的JNI(Java Native Interface):下面是一个简单的实例过程:

1、在eclipse里面创建一个hellojni工程,这个工程里面在com.java.jni包下面创建一个HelloJNI.java文件,如下:

package com.java.jni;public class HelloJNI {public native String sayHello();public static void main(String[] args) {}}

在这里我们可以看到方法sayHello()声明字段里面有native,这个native就是表示这个sayHello()函数是Java代码中要调用 的native函数(C或C++写的函数);

2、利用javac 编译HelloJNI.java文件,得到HelloJNI.class文件(注意当有包的时候,在编译的时候,用javac com/java/jni/HelloJNI.java)

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程序中包含jni.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 {System.loadLibrary("HelloJNI");}public static void main(String[] args) {new HelloJNI().sayHello();}}


原创粉丝点击