2019独角兽企业重金招聘Python工程师标准>>>

Java通过JNI实现调用C++程序

好久没碰JNI这个东西了,刚工作的时候自己写过点东西,这么些年很少用到,最近一个项目又用到它了,因此总结一下给自己留个记号!省下下次再用到到处查资料。Java通过JNI实现调用C或者C++写的程序,实现对底层或者下位机的读写通讯,在桌面开发中是经常遇到的。这里通过一个演示程序,实现Java通过JNI实现C++方法调用。要完成Java JNI调用C++程序,需要如下几步:

第一步:创建一个Java Class文件,定义好本地方法接口API,其中本地方法前面要加上关键字native才可以。

[java] view plain copy

  1. <span style="font-size:18px;">package com.gloomyfish.jnidemo;
  2. public class HelloJNI {
  3. public native int helloJNI(String name);
  4. }
  5. </span>

第二步:是要编译对应的Java文件HelloJNI.java通过javah这个命令行即可,我这里写了个bat文件,这样可以指定JDK版本,只要把这个bat文件放到对应的eclipse编译好的build或者bin或者target目录下,然后双击运行即可,bat文件的内容如下:

[html] view plain copy

  1. <span style="font-size:18px;">set JAVA_HOME=D:\jdk1.6.0_16
  2. set path=%JAVA_HOME%\bin;%path%
  3. set classpath=.;%classpath%;%JAVA_HOME%\lib
  4. javah com.gloomyfish.jnidemo.HelloJNI</span>

运行之后会得到com_gloomyfish_jnidemo_HelloJNI.h文件,打开查看内容应该显示如下:

[cpp] view plain copy

  1. <span style="font-size:18px;">/* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class com_gloomyfish_jnidemo_HelloJNI */
  4. #ifndef _Included_com_gloomyfish_jnidemo_HelloJNI
  5. #define _Included_com_gloomyfish_jnidemo_HelloJNI
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10. * Class:     com_gloomyfish_jnidemo_HelloJNI
  11. * Method:    helloJNI
  12. * Signature: (Ljava/lang/String;)I
  13. */
  14. JNIEXPORT jint JNICALL Java_com_gloomyfish_jnidemo_HelloJNI_helloJNI
  15. (JNIEnv *, jobject, jstring);
  16. #ifdef __cplusplus
  17. }
  18. #endif
  19. #endif
  20. </span>

第三步:打开VS2015新建一个win32项目

点击下一步选择应用程序类型中DLL,显示如下:

然后点击【完成】,目录结构显示如下图双击打开jnitest.cpp,

右键添加生成的JNI头文件

此外还要添加JDK目录下面include里面的三个头文件jni.h与jawt_md.h与jni_md.h所在的目录。添加方法,右键【jnitest】选择->属性

然后完成如下的C++代码

[cpp] view plain copy

  1. <span style="font-size:18px;">// jnitest.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include "com_gloomyfish_jnidemo_HelloJNI.h"
  5. JNIEXPORT jint JNICALL Java_com_gloomyfish_jnidemo_HelloJNI_helloJNI
  6. (JNIEnv *env, jobject obj, jstring param) {
  7. // convert java string type to c++ char* type
  8. const char* name = env->GetStringUTFChars(param, 0);
  9. printf("%s %s", "Hello JNI, I am ", name);
  10. // release memory
  11. env->ReleaseStringUTFChars(param, name);
  12. // return 0;
  13. return 0;
  14. }
  15. </span>

生成解决方案之后得到jnitest.dll文件,把DLL文件copy到对应的JDK的bin目录下面和JRE的bin目录下,然后在Java程序中添加如下测试代码:

转载于:https://my.oschina.net/yizhichao/blog/1551805

Java通过JNI调用C++的DLL库相关推荐

  1. Java通过JNI调用C++动态链接库dll,并打在jar包内 ——JNA-JNI(一)

    Java通过JNI调用C++动态链接库dll,并打在jar包内--JNA-JNI(一) 系列文章: Java通过JNI调用C++动态链接库dll,并打在jar包内 --JNA-JNI(一) Java使 ...

  2. JAVA通过JNI调用C++动态链接库CLL(二)

    简介 使用Visual Studio 2017新建c++动态链接库dll项目 编写JniDemo.h中getName实现并生成DLL 编写JniDemo.h在JniDemo.c实现getName方法 ...

  3. JAVA通过JNI调用C++动态链接库CLL(一)

    简介 使用eclipse新建JAVA项目并生成.h头文件 新建项目JniDemo 新建测试类JniTest并声明一个native的方法 使用Javah命令生成native方法的声明的C/C++头文件 ...

  4. Java通过-jni调用c语言

    Java通过-jni调用c语言 一.编写JAVA程序 二.编译h头文件 三.编写C方法实现 四.生成对象文件 五.生成动态链接库 六.执行 一.编写JAVA程序 public class TestNa ...

  5. Java调用C++的dll库

    项目中要实现java调用C++的dll,先实现个简单的加法.减法的案例.本案例为个人记录,为大家提供一些参考. 总体思路:先在Java中建立一个类--------通过javac命令生成.class-- ...

  6. 转(JAVA的JNI调用)

    转载于:https://www.cnblogs.com/GDUT/p/3806771.html 由于JNI调用C和调用C++差不多,而且C++中可以混合写C代码,所以这里主要是写关于JNI调用C++的 ...

  7. 用java的jni调用C语言的API,实现带图形界面的一元稀疏多项式计算器

    实现步骤: 1) 完成Java代码,编写好Java调用类. 2) 编译你的Java类. 3) 用javah生成编译好的class文件对应的C/C++ 函数的头文件. 4) 实现头文件中的函数原型,编写 ...

  8. java通过jni调用c++并联调

    1 jni 1.1 jni简介 本节摘抄自:https://blog.csdn.net/qq_28261343/article/details/77971823 JNI是Java Native Int ...

  9. java在主程序修改函数输出,Java通过JNI调用CUDA

    --NG 这段时间因为工作需要,要用到在java中调用cuda程序,但是令人蛋疼的是网上这方面的资料几乎没有,所以只好我自己摸索.我的想法是通过java的JNI接口调用cuda,但是很明显正常情况下是 ...

最新文章

  1. dp cf 20190615
  2. linux命令的导入,[导入]Linux基本命令
  3. AI和物联网在零售环境中的长期应用
  4. 如何使用SQLite
  5. Unsupported Hardware Detected
  6. Exchange2003-2010迁移系列之九,创建DAG组
  7. ps怎么对比原图快捷键_PS学习之旅:ps如何制作满天星,让你夜晚的天空图片更美...
  8. Freezer - 备份云硬盘实现
  9. python中二进制表示_Python中的二进制搜索:直观介绍
  10. log4j 新建日志 重启_Java中log4j控制写入日志开关
  11. EXTJS Date 的转换格式化字符
  12. MySQL 死锁专题问题处理
  13. 台式计算机开机密码设置,设置台式电脑的开机锁屏密码的方法步骤
  14. lg g2 android 5.0 rom,LG G2(D802)升级Flyme4.5图文教程
  15. [工作笔记之一] 转正答辩 2015-08-04 15:08
  16. EXCEL workbook.saveas 函数详解
  17. edge怎么开启沉浸式阅读_《幻塔》首测今日开启 探索沉浸式开放世界_网络游戏新闻...
  18. chrome浏览器的性能测试--本文引用自 百度百科http://baike.baidu.com/view/1835504.htm
  19. Python爬虫,爬取快看漫画每日更新模块
  20. cfd计算机辅助技术,CFD仿真在生物医学领域拯救生命

热门文章

  1. Java基础教程【第二章:Java数据类型和变量】
  2. spring学习--基于注解 注入属性
  3. ebaz s9 zynq linux中关于网络的一些小问题
  4. silverlight安装后网页_纯干货收藏|两个技巧教你完美长截屏网页!
  5. win10支持linux内核版本是多少,win10自带linux版本是多少
  6. matlab的v带优化设计,基于遗传算法及MATLAB的V带传动优化设计
  7. mysql 安装在路由器_MySQL如何安装?安装MySQL数据库的三种方法
  8. mysql的数据库的索引_MySQL 数据库索引原理与分类
  9. python re 简单实例_python的re正则表达式实例代码
  10. vue 打开html流_三种方案解决Vue项目打包后dist中的index.html用浏览器无法直接打开的问题...