java的jni模块可以实现本地方法的调用,当java语言无法实现某个功能,或者效率比较低下,可以调用效率较高的c或者c++,这里以c举例。
运行环境:

  • jdk1.8 32位
  • visual studio 2013
  • idea

主要包括三步:

  1. 使用java编写函数声明,方法上标明native,使用javah命令生成头文件。
  2. 使用c语言实现声明的函数,同时导入jni.h,jni_md.h,和上述生成的头文件。
  3. 编写java代码,加载动态链接库,调用c。

详细过程如下:

1、java语言编写函数声明,标明native。

package com.company.jni;public class NativeTest {public static native void greeting();
}

在源文件所在目录下,执行

javac -h . NativeTest.java

生成字节码文件和头文件
如图:

也可以在src目录下,执行以下命令也可以生成头文件。

javah com.company.jni.NativeTest

如图:

2、使用visual studio创建动态链接库,注意不要使用codeblocks,这个会报错,创建过程如图:

选择DLL、空项目。

接着在项目的根目录下,添加三个头文件,直接复制即可。

  • com_company_jni_NativeTest.h 第一步生成的头文件
  • jni.h 在jdk/include目录下
  • jni_md.h 在jdk/include/win32目录下

接着需要在解决方案资源管理器中的头文件添加现有项,添加这三个头文件。

接着在源文件添加新建项,创建test.c源文件,需要实现
com_company_jni_NativeTest.h中的函数声明。注意这个函数的名称是有讲究的。同时将这个文件的#include<jni.h> 改为#include “jni.h”。

JNIEXPORT void JNICALL Java_com_company_jni_NativeTest_greeting(JNIEnv *, jclass);

test.c文件

#include<stdio.h>
#include "com_company_jni_NativeTest.h"JNIEXPORT void JNICALL Java_com_company_jni_NativeTest_greeting(JNIEnv * env, jclass cl){printf("hello world!");
}

3、编写java代码,NativeTestDemo.java

package com.company.jni;public class NativeTestDemo {static{System.loadLibrary("native");// 不用加后缀名称}public static void main(String[] args) {NativeTest.greeting();}
}

注意,动态链接库在目录native/Debug下,不需要后缀名,需要在idea运行时,做如下配置,指定动态链接库的目录。
具体步骤:点击edit configurations,在vm添加如下命令行参数。

-Djava.library.path=E:\Projects\native\Debug


同时需要注意如果使用codeblocks生成的动态链接库报错如下:

Exception in thread "main" java.lang.UnsatisfiedLinkError: com.company.jni.NativeTest.greeting()V

使用jdk1.8 64位,报错如下:

E:\Projects\native\Debug\native.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform

所以使用visual studio和jdk1.8 32位。

运行结果如图,调用成功。

使用Java的JNI调用C相关推荐

  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在主程序修改函数输出,Java通过JNI调用CUDA

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

  6. Java通过JNI调用C++的DLL库

    2019独角兽企业重金招聘Python工程师标准>>> Java通过JNI实现调用C++程序 好久没碰JNI这个东西了,刚工作的时候自己写过点东西,这么些年很少用到,最近一个项目又用 ...

  7. 转(JAVA的JNI调用)

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

  8. java通过jni调用虚拟游戏控制器vjoy

    这几天打算做个游戏方向盘之类的,找到了vjoy,安装后会虚拟出1到16个游戏控制器,每个游戏控制器最多支持8轴128键,还有力反馈什么的,提供有skd可以编写client端控制这些游戏控制器的各个轴. ...

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

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

  10. Java利用JNI调用c++代码简易例子演示

    点击打开链接 (提取码:8676) 一.首先简单交代一下两个问题: 1.什么是JNI                - - -     JNI的全名为Java Native Interface(Jav ...

最新文章

  1. 服务器上装centos系统花屏,CentOS系统如何解决鼠标花屏的问题
  2. matlab在电力行业中的仿真技术-MATLAB小电流接地系统单向故障仿真分析
  3. jquery 根据class名 赋值_jQuery简单用法!!!
  4. 依赖注入_引用其他的bean
  5. python返回unicode_我们如何从python中的字形id获取unicode?
  6. 【Ruby】Ruby 类案例
  7. php的文件包含总结 include require include_once require_once
  8. LeerCode 题 - 14. 最长公共前缀
  9. 针式打印机设置连续打印不分页_打印机的应用与耗材介绍
  10. npp夜光数据介绍 viirs_优化的NPP夜光月度数据下载
  11. 关乎Python lambda你也看得懂
  12. python2.0 s12 day4
  13. ubuntu14 lamp环境下安装swoole1.8.6
  14. atitit.编程语言 程序语言 的 工具性 和 材料性 双重性 and 语言无关性 本质
  15. 构建一个可行的BI系统的造价是多少,实施周期?具备条件基础是什么? 数据量有要求么
  16. 卢森堡携手欧洲航天局,在大公国建立独一无二的“欧洲太空资源创新中心”
  17. 学习软件测试必备的网站清单,建议收藏!
  18. 图片识别出处_搜图神器!你还在问图片的出处吗?
  19. js多线程编程web worker
  20. Aliyun 学习笔记(二)阿里云物联网平台介绍

热门文章

  1. 将矩阵化为上三角矩阵
  2. Ubuntu安装腾达u12驱动
  3. ceph部署-纠删码
  4. Android多媒体功能开发(7)——使用SoundPool类播放音频
  5. Matlab S函数求解二阶微分方程或二阶动态方程
  6. creo绘图属性模板_creo完整制作工程图模板.docx
  7. Nodejs页面访问加载静态资源
  8. kubernetes完整二进制部署从0到1
  9. 南京邮电大学java第三次实验报告
  10. 工程师职业发展的四个阶段