JAVA调用c/c++代码
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,这个头文件是根据包名和类名来命名的。
1 /* DO NOT EDIT THIS FILE - it is machine generated */2 #include <jni.h>3 /* Header for class com_test_TestNative */4 5 #ifndef _Included_com_test_TestNative6 #define _Included_com_test_TestNative7 #ifdef __cplusplus8 extern "C" {9 #endif 10 /* 11 * Class: com_test_TestNative 12 * Method: sayHello 13 * Signature: ()V 14 */ 15 JNIEXPORT void JNICALL Java_com_test_TestNative_sayHello 16 (JNIEnv *, jobject); 17 18 #ifdef __cplusplus 19 } 20 #endif 21 #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添加到该工程中,然后创建一个源文件引用该头文件并且实现头文件中本地函数的功能:
1 #include<iostream.h> 2 #include"com_test_TestNative.h" 3 4 JNIEXPORT void JNICALL Java_com_test_TestNative_sayHello(JNIEnv *env, jobject obj) 5 { 6 cout<<"hello world!"<<endl; 7 }
这里因为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调用本地函数
1 package com.test;2 3 public class TestNative {4 public native void sayHello();5 6 /**7 * @param args8 */9 public static void main(String[] args) { 10 System.loadLibrary("NativeCode"); 11 TestNative tNative = new TestNative(); 12 tNative.sayHello(); 13 } 14 }
第10行是加载动态链接库,JVM只需要加载一次就可以调用了,“NativeCode”是上面生成的动态链接库的名字,不含后缀名。
运行该程序,成功打印输出了"hello world"。
转载于:https://www.cnblogs.com/senior-engineer/p/4969599.html
JAVA调用c/c++代码相关推荐
- lisp java_从Java调用的LISP代码
长篇小说: 我正在为我的函数编程类做一个项目,我想到在Lisp中为 Mario AI competition . 我正在研究从Java调用LISP代码的框架/库/方式,甚至更好的LISP Java互通 ...
- JNI 最简单的Java调用C/C 代码
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! JNI_ ...
- java调用SSIS java调用dtsx包 代码+图示
今天,主管让研究SSIS,网上找了些资料,用VS2005,做了一个简单的资料导入功能.有了.dtsx文件 可是要怎么应用到我的java web程序呢.苦于网上资料很少,去微软的msdn上提问了,也无果 ...
- java调用app接口代码_java servlet手机app访问接口(二)短信验证
今天找了几个短信平台,其实最想使用的一个是sharesdk,使用它上面http api短信功能,不仅价格低,而且最少可以充值100RMB,但是审核过于严格,对应APP还必须集成他们的短信功能,而且要上 ...
- java调用支付宝接口代码介绍
App支付产品介绍 更新时间:2018-05-08 场景介绍 适用于商家在App应用中集成支付宝支付功能. 商家APP调用支付宝提供的SDK,SDK再调用支付宝APP内的支付模块.如果用户已安装支付宝 ...
- 用Java调用C语言代码实例(JNI)
为初步理解Java中native本地方法的使用,提出使用native方法实现计算任意正整数二进制的需求(native方法是Java中的本地方法,一般采用C/C++通过JNI(Java native i ...
- java 调用打印机 api_java 调用打印机API无法打印,但是直接打印可以,请问有人遇到过这样的问题吗?...
java调用打印机的代码如下:publicstaticvoidmain(String[]args){PrintRequestAttributeSetpras=newHashPrintRequestAt ...
- java 调用c++ jni_Java中使用JNI调用C++
1,JNI是什么? JNI即Java Native Interface(Java本地接口),是一个协议,主要作用为:实现Java调用c/c++代码(类库),或者C/C++调用Java代码 2,主要实现 ...
- Java调用Python
先说句题外话:无论是在C中还是Java中调用Python,当遇到多线程的时候一定要想到GIL锁的存在. 在Python中调用C/C++代码:这也是最常见的混合编程方式.并且有很多优秀的开源项目可以帮助 ...
最新文章
- luogu P3203 [HNOI2010]弹飞绵羊(LCT ? 暴力分块 ! )
- AndroidToast问题深度剖析(一)
- 绘制不同光照条件下识别率多项式拟合曲线图(暂未找到最佳拟合曲线)
- Windows server 2003 体系结构
- leetcode 381. O(1) 时间插入、删除和获取随机元素 - 允许重复
- 修改 gcc 和 g++ 的默认版本
- SQL前三章知识点测试
- php更改html内容,请问你们怎么将html的文件的内容改变为php
- 网络_检测公网端口是否开启
- c语言统计计算机专业人数,非计算机专业C语言练习题及2013版中国统计年鉴1.doc...
- 关于一些3D数学基础的习题,感兴趣的同行进来帮帮忙啦。
- javaEE常用开源框架的认识及概述,带你深入探索Java开发世界
- 阿里出品的最新版 Java 开发手册,嵩山版,扫地僧
- 日期操作工具2:DateUtil
- flutter 斗音页面
- apex语言与java比较_Apex 基础知识合辑
- 谈谈对K8S CNI、CRI和CSI插件的理解
- Mysql—忘记密码重置密码报错
- 交换机Meth0是什么端口,啥作用?
- 社区活动| Apache Doris 社区开发者会议议题征集中
热门文章
- 指向结构体的指针别名
- Hamilton Verissimo的blog
- 【Python-ML】SKlearn库多元线性回归性能评估
- (转载)机器学习知识点(十二)坐标下降法(Coordinate descent)
- SpringMVC入门案例
- Java的知识点27——打印子孙级目录和文件的名称、统计文件夹的大小、编码与解码的应用
- js实践篇:例外处理Try{}catch(e){}
- Chrome浏览器不支持字体小于12px的解决办法
- C#中RichTextBox文本居中显示
- 使用坚果云同步SVN服务器数据