Java通过JNI调用C++的DLL库
2019独角兽企业重金招聘Python工程师标准>>>
Java通过JNI实现调用C++程序
好久没碰JNI这个东西了,刚工作的时候自己写过点东西,这么些年很少用到,最近一个项目又用到它了,因此总结一下给自己留个记号!省下下次再用到到处查资料。Java通过JNI实现调用C或者C++写的程序,实现对底层或者下位机的读写通讯,在桌面开发中是经常遇到的。这里通过一个演示程序,实现Java通过JNI实现C++方法调用。要完成Java JNI调用C++程序,需要如下几步:
第一步:创建一个Java Class文件,定义好本地方法接口API,其中本地方法前面要加上关键字native才可以。
[java] view plain copy
- <span style="font-size:18px;">package com.gloomyfish.jnidemo;
- public class HelloJNI {
- public native int helloJNI(String name);
- }
- </span>
第二步:是要编译对应的Java文件HelloJNI.java通过javah这个命令行即可,我这里写了个bat文件,这样可以指定JDK版本,只要把这个bat文件放到对应的eclipse编译好的build或者bin或者target目录下,然后双击运行即可,bat文件的内容如下:
[html] view plain copy
- <span style="font-size:18px;">set JAVA_HOME=D:\jdk1.6.0_16
- set path=%JAVA_HOME%\bin;%path%
- set classpath=.;%classpath%;%JAVA_HOME%\lib
- javah com.gloomyfish.jnidemo.HelloJNI</span>
运行之后会得到com_gloomyfish_jnidemo_HelloJNI.h文件,打开查看内容应该显示如下:
[cpp] view plain copy
- <span style="font-size:18px;">/* DO NOT EDIT THIS FILE - it is machine generated */
- #include <jni.h>
- /* Header for class com_gloomyfish_jnidemo_HelloJNI */
- #ifndef _Included_com_gloomyfish_jnidemo_HelloJNI
- #define _Included_com_gloomyfish_jnidemo_HelloJNI
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: com_gloomyfish_jnidemo_HelloJNI
- * Method: helloJNI
- * Signature: (Ljava/lang/String;)I
- */
- JNIEXPORT jint JNICALL Java_com_gloomyfish_jnidemo_HelloJNI_helloJNI
- (JNIEnv *, jobject, jstring);
- #ifdef __cplusplus
- }
- #endif
- #endif
- </span>
第三步:打开VS2015新建一个win32项目
点击下一步选择应用程序类型中DLL,显示如下:
然后点击【完成】,目录结构显示如下图双击打开jnitest.cpp,
右键添加生成的JNI头文件
此外还要添加JDK目录下面include里面的三个头文件jni.h与jawt_md.h与jni_md.h所在的目录。添加方法,右键【jnitest】选择->属性
然后完成如下的C++代码
[cpp] view plain copy
- <span style="font-size:18px;">// jnitest.cpp : 定义 DLL 应用程序的导出函数。
- //
- #include "stdafx.h"
- #include "com_gloomyfish_jnidemo_HelloJNI.h"
- JNIEXPORT jint JNICALL Java_com_gloomyfish_jnidemo_HelloJNI_helloJNI
- (JNIEnv *env, jobject obj, jstring param) {
- // convert java string type to c++ char* type
- const char* name = env->GetStringUTFChars(param, 0);
- printf("%s %s", "Hello JNI, I am ", name);
- // release memory
- env->ReleaseStringUTFChars(param, name);
- // return 0;
- return 0;
- }
- </span>
生成解决方案之后得到jnitest.dll文件,把DLL文件copy到对应的JDK的bin目录下面和JRE的bin目录下,然后在Java程序中添加如下测试代码:
转载于:https://my.oschina.net/yizhichao/blog/1551805
Java通过JNI调用C++的DLL库相关推荐
- Java通过JNI调用C++动态链接库dll,并打在jar包内 ——JNA-JNI(一)
Java通过JNI调用C++动态链接库dll,并打在jar包内--JNA-JNI(一) 系列文章: Java通过JNI调用C++动态链接库dll,并打在jar包内 --JNA-JNI(一) Java使 ...
- JAVA通过JNI调用C++动态链接库CLL(二)
简介 使用Visual Studio 2017新建c++动态链接库dll项目 编写JniDemo.h中getName实现并生成DLL 编写JniDemo.h在JniDemo.c实现getName方法 ...
- JAVA通过JNI调用C++动态链接库CLL(一)
简介 使用eclipse新建JAVA项目并生成.h头文件 新建项目JniDemo 新建测试类JniTest并声明一个native的方法 使用Javah命令生成native方法的声明的C/C++头文件 ...
- Java通过-jni调用c语言
Java通过-jni调用c语言 一.编写JAVA程序 二.编译h头文件 三.编写C方法实现 四.生成对象文件 五.生成动态链接库 六.执行 一.编写JAVA程序 public class TestNa ...
- Java调用C++的dll库
项目中要实现java调用C++的dll,先实现个简单的加法.减法的案例.本案例为个人记录,为大家提供一些参考. 总体思路:先在Java中建立一个类--------通过javac命令生成.class-- ...
- 转(JAVA的JNI调用)
转载于:https://www.cnblogs.com/GDUT/p/3806771.html 由于JNI调用C和调用C++差不多,而且C++中可以混合写C代码,所以这里主要是写关于JNI调用C++的 ...
- 用java的jni调用C语言的API,实现带图形界面的一元稀疏多项式计算器
实现步骤: 1) 完成Java代码,编写好Java调用类. 2) 编译你的Java类. 3) 用javah生成编译好的class文件对应的C/C++ 函数的头文件. 4) 实现头文件中的函数原型,编写 ...
- java通过jni调用c++并联调
1 jni 1.1 jni简介 本节摘抄自:https://blog.csdn.net/qq_28261343/article/details/77971823 JNI是Java Native Int ...
- java在主程序修改函数输出,Java通过JNI调用CUDA
--NG 这段时间因为工作需要,要用到在java中调用cuda程序,但是令人蛋疼的是网上这方面的资料几乎没有,所以只好我自己摸索.我的想法是通过java的JNI接口调用cuda,但是很明显正常情况下是 ...
最新文章
- dp cf 20190615
- linux命令的导入,[导入]Linux基本命令
- AI和物联网在零售环境中的长期应用
- 如何使用SQLite
- Unsupported Hardware Detected
- Exchange2003-2010迁移系列之九,创建DAG组
- ps怎么对比原图快捷键_PS学习之旅:ps如何制作满天星,让你夜晚的天空图片更美...
- Freezer - 备份云硬盘实现
- python中二进制表示_Python中的二进制搜索:直观介绍
- log4j 新建日志 重启_Java中log4j控制写入日志开关
- EXTJS Date 的转换格式化字符
- MySQL 死锁专题问题处理
- 台式计算机开机密码设置,设置台式电脑的开机锁屏密码的方法步骤
- lg g2 android 5.0 rom,LG G2(D802)升级Flyme4.5图文教程
- [工作笔记之一] 转正答辩 2015-08-04 15:08
- EXCEL workbook.saveas 函数详解
- edge怎么开启沉浸式阅读_《幻塔》首测今日开启 探索沉浸式开放世界_网络游戏新闻...
- chrome浏览器的性能测试--本文引用自 百度百科http://baike.baidu.com/view/1835504.htm
- Python爬虫,爬取快看漫画每日更新模块
- cfd计算机辅助技术,CFD仿真在生物医学领域拯救生命
热门文章
- Java基础教程【第二章:Java数据类型和变量】
- spring学习--基于注解 注入属性
- ebaz s9 zynq linux中关于网络的一些小问题
- silverlight安装后网页_纯干货收藏|两个技巧教你完美长截屏网页!
- win10支持linux内核版本是多少,win10自带linux版本是多少
- matlab的v带优化设计,基于遗传算法及MATLAB的V带传动优化设计
- mysql 安装在路由器_MySQL如何安装?安装MySQL数据库的三种方法
- mysql的数据库的索引_MySQL 数据库索引原理与分类
- python re 简单实例_python的re正则表达式实例代码
- vue 打开html流_三种方案解决Vue项目打包后dist中的index.html用浏览器无法直接打开的问题...