Java程序调用C/C++语言函数的方法
来源:才华咖 本文已影响1.08W人
来源:才华咖 本文已影响1.08W人
导语:Java提供了完备的C/C++语言接口,这样我们可以利用C语言的强大功能实现Java难以实现的功能,在一定程序上消除Java的局限性和低效率。 下面就由小编为大家介绍一下Java程序调用C/C++语言函数的方法,欢迎大家阅读!
一、创建DLL文件
使用某一种C/C++开发工具创建Dll文件,实现某一功能,供JAVA调用,例如本文在此使用Visual studio 2005创建一个名为testdll的动态库文件。
二、使用JNI
JNI是Java Native Interface的缩写,中文为JAVA本地调用。它允许Java代码和其他语言写的代码进行交互。
类
在JAVA程序中,首先需要在类中声明所调用的库名称,如下:
static {
Library(“testdll”); //加载动态库,testdll为DLL文件名称
}
还需要对将要调用的方法做本地声明,关键字为native。并且只需要声明,而不需要具体实现。如下:
public native static void set(int i);
public native static int get();
然后编译该JAVA程序文件,生成CLASS,再用JAVAH命令,JNI就会生成C/C++的头文件。
例如程序,内容为:
public class testdll { static { Library(“testdll”); } public native static int get(); public native static void set(int i); public static void main(String[] args) { testdll test = new testdll(); (10); tln(()); } }
用javac 编译它,会生成s。
再用javah testdll,则会在当前目录下生成testdll.h文件,这个文件需要被C/C++程序调用来生成所需的库文件。
2.C/C++
创建C/C++项目需要增加的头文件有jni.h、jni_md.h这两个文件是JNI中必须的;还有就是增加testdll.h。
对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。
接上例子。我们先看一下testdll.h文件的内容:
#include #ifndef _Included_testdll #define _Included_testdll #ifdef __cplusplus extern "C" { #endif JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass); JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint); #ifdef __cplusplus } #endif #endif
在具体实现的时候,我们只关心两个函数原型 JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass);和 JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint);这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使JAVA的类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。
下面我们用文件具体实现这两个函数:#include "testdll.h" int i = 0; JNIEXPORT jint JNICALL Java_testdll_get (JNIEnv *, jclass) { return i; } JNIEXPORT void JNICALL Java_testdll_set (JNIEnv *, jclass, jint j) { i = j+5; }
编译连接成库文件,这里就是。把拷贝到s的目录下,java testdll运行它,就可以观察到结果了。
三、总结
使用JNI可以在JAVA中调用其它语言编写的代码,在一定程度上消除JAVA的局限性和低效率。
javascript中的match函数用法简介
Javascript时间格式format函数的两种使用方法
Javascript中的数学函数方法
javascript中各种函数的使用方法
Javascript函数的定义和用法分析
javascript数组使用调用方法
java使用ConcurrentHashMap和计数器实现锁的方法
Java中调用Oracle包的过程
分析JavaScript函数的调用模式
浅析Java程序与C语言的区别
JavaScript与java语言的区别
javascript匿名函数的用法
使用ajax操作JavaScript对象的方法
JavaScript中exec函数用法
最常用的20个javascript方法函数
javascript中普通函数的使用介绍
Java语言程序调试技巧与多线程问题
JavaScript中常用的函数类型
有关javascript在IE下trim函数无法使用的解决方法
JavaScript 函数式编程实践
JavaScript小实验之函数引用
Javascript数组与字典用法分析方法
Javascript中函数名.length属性用法
使用Java程序连接各种数据库的方法介绍
java与javascript之间json格式数据互转详解
JavaScript客户端MVC框架用法
关于java程序员的认证SCJP考试
2017最新javascript中AJAX用法
JavaScript函数的多种写法
JavaScript中常见的字符串操作函数及用法
关于古筝c调调节方法
c语言学习方法
c语言程序设计心得(多篇)
在JavaScript中操作数组之map()方法的使用示例
ORACLE下开发JAVA程序常见问题解答
JavaScript数组常用方法介绍
javascript函数命名的三种方式及区别
在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern "C
一些常用的JavaScript函数
使用Java程序连接各种数据库的8种方法