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();}}
- Java之JNI初步认识
- JNI初步认识
- 技术演绎之 [ java ] 初步认识
- android之JNI初步
- scala之初步认识
- 计算机网络之初步认识
- CoordinatorLayout之初步认识
- java JNI 初步学习
- java初步jni学习
- [ java ] JNI初步!
- java jni 初步入门
- JAVA初步认识线程
- java-ObjectStream初步认识
- 初步认识java泛型
- Java初步认识
- java native初步认识
- Java初步认识
- 初步认识Java
- css+js控制图片展示
- ASP.NET MVC 2的代码以MS-PL协议开源发布
- 可选择Email和用户名登录的代码
- 舞蹈
- 鼠标经过input时的颜色发生变化
- Java之JNI初步认识
- 符合标准的Focus功能的提交信息表单
- 仿Chinaz首页菜单导航
- 一个精彩的JS+CSS精彩导航实例
- 判断是否是2的N次方——证明x & (x - 1)==0的正确性
- HDU1042 N! 万进制
- 滑动效果,适合做faq或menu
- 织梦dedeCMS二次开发文档手册,文件详解以及数据库结构字段说明
- Struts2源代码分析之Struts2 Interceptor模式