Java通过JNI调用C++程序
来源:互联网 发布:淘宝网店创业计划书 编辑:程序博客网 时间:2024/04/30 18:06
JNI是Java Native Interface的缩写,中文为JAVA本地调用。使用JNI可以很方便的用我们的Java程序调用C/C++程序。很多时候,某些功能用Java无法实现,比如说涉及到底层驱动的一些功能,这时候我们就可以利用JNI来调用C或者C++程序来实现,这就是JNI的强大之处。但是JNI也有它的缺点,使用java与本地已编译的代码交互,通常会丧失平台可移植性。
下面是一个JNI例子,调用C++输出"hello world":
第一步:创建Java类,在里面定义一个本地方法(用native关键字修饰的方法)
public native void sayHello();
第二步:使用javah命令(javah 类的全路径)生成本地方法的C++头文件
在DOS窗口中进入工程所在目录,然后执行javah com.test.TestNative命令,执行完之后就会在当前目录生成一个后缀名为.h的头文件,如com_test_TestNative.h,这个头文件是根据包名和类名来命名的。
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_test_TestNative */#ifndef _Included_com_test_TestNative#define _Included_com_test_TestNative#ifdef __cplusplusextern "C" {#endif/* * Class: com_test_TestNative * Method: sayHello * Signature: ()V */JNIEXPORT void JNICALL Java_com_test_TestNative_sayHello (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
15、16行是对TestNative类中的本地方法sayHello()的声明。这个h文件相当于我们在java里面的接口,这里声明了一个 Java_com_test_TestNative_sayHello (JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致。
第三步:编写C/C++本地代码,生成动态链接库文件
首先在VC6.0(当然也可以用其他工具)中创建一个dll工程---Win32 Dynamic-Link Library工程。然后将上面生成的头文件com_test_TestNative.h添加到该工程中,然后创建一个源文件引用该头文件并且实现头文件中本地函数的功能:
#include<iostream.h> #include"com_test_TestNative.h" JNIEXPORT void JNICALL Java_com_test_TestNative_sayHello(JNIEnv *env, jobject obj) { cout<<"hello world!"<<endl; }
这里因为com_test_TestNative.h中引入了jni.h所以要将jni.h加入到VC6.0安装目录下的Include目录中。jni.h在JDK安装目录下的include中,同时得件include/win32中的两个头文件jawt_md.h、jni_md.h也导入到VC6.0中。
将所依赖的头文件导入之后,我们就可以构建该工程了,按F7就行了,完了会在工程目录中的Degug目录下生成一个动态链接库文件,我这里生成的是NativeCode.dll。我们就可以将该dll文件拷贝到环境变量path所包含的目录下给咱们的Java程序调用了,为了方便,我们也可以将dll所在的工程目录加入到环境变量path中去,这样可以避免每次都要拷贝的麻烦。注意修改环境变量之后要重启myeclipse。
第四步:Java调用本地函数
package com.test;public class TestNative { public native void sayHello(); /** * @param args */ public static void main(String[] args) { System.loadLibrary("NativeCode"); TestNative tNative = new TestNative(); tNative.sayHello(); }}
第10行是加载动态链接库,JVM只需要加载一次就可以调用了,“NativeCode”是上面生成的动态链接库的名字,不含后缀名。
运行该程序,成功打印输出了"hello world"。
- java通过jni调用C程序
- JNI小程序:Java通过JNI调用C程序
- JAVA中通过JNI调用C程序实例教程
- Java通过JNI调用本地C/C++程序
- Java通过JNI调用本地C/C++程序--常用示例
- java JNI调用c程序
- Java通过JNI调用C++程序
- Java通过JNI调用C++程序
- Java通过JNI调用C++程序
- Java通过JNI调用C++程序
- Java通过JNI调用C++程序
- Java通过JNI调用CUDA程序
- Java通过JNI调用C++程序
- Java通过JNI调用C++程序
- Java通过JNI调用C++程序
- JAVA通过JNI调用C++程序实践
- Java通过JNI调用C/C++函数
- JAVA通过JNI调用C函数Demo
- dayplan
- Java - Think in Java 第4章 习题
- PHP树生成迷宫及A*自动寻路算法
- qxt: 并不支持qt5,其他excel解析的情况
- 笔试 - 洗牌算法
- Java通过JNI调用C++程序
- kafka 学习笔记(二)之Java Producer客户端
- Google 镜像站搜集
- 曹娥做系统是如何感知事件的???
- ZOJ 3761 Easy billiards (DFS性质)
- 黑马程序员-java基础IO流(2)
- 黑马程序员 面向对象 单例设计模式
- 黑马程序员 面向对象 继承 抽象
- 黑马程序员 面向对象 接口