使用Java的JNI调用C
java的jni模块可以实现本地方法的调用,当java语言无法实现某个功能,或者效率比较低下,可以调用效率较高的c或者c++,这里以c举例。
运行环境:
- jdk1.8 32位
- visual studio 2013
- idea
主要包括三步:
- 使用java编写函数声明,方法上标明native,使用javah命令生成头文件。
- 使用c语言实现声明的函数,同时导入jni.h,jni_md.h,和上述生成的头文件。
- 编写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相关推荐
- 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在主程序修改函数输出,Java通过JNI调用CUDA
--NG 这段时间因为工作需要,要用到在java中调用cuda程序,但是令人蛋疼的是网上这方面的资料几乎没有,所以只好我自己摸索.我的想法是通过java的JNI接口调用cuda,但是很明显正常情况下是 ...
- Java通过JNI调用C++的DLL库
2019独角兽企业重金招聘Python工程师标准>>> Java通过JNI实现调用C++程序 好久没碰JNI这个东西了,刚工作的时候自己写过点东西,这么些年很少用到,最近一个项目又用 ...
- 转(JAVA的JNI调用)
转载于:https://www.cnblogs.com/GDUT/p/3806771.html 由于JNI调用C和调用C++差不多,而且C++中可以混合写C代码,所以这里主要是写关于JNI调用C++的 ...
- java通过jni调用虚拟游戏控制器vjoy
这几天打算做个游戏方向盘之类的,找到了vjoy,安装后会虚拟出1到16个游戏控制器,每个游戏控制器最多支持8轴128键,还有力反馈什么的,提供有skd可以编写client端控制这些游戏控制器的各个轴. ...
- 用java的jni调用C语言的API,实现带图形界面的一元稀疏多项式计算器
实现步骤: 1) 完成Java代码,编写好Java调用类. 2) 编译你的Java类. 3) 用javah生成编译好的class文件对应的C/C++ 函数的头文件. 4) 实现头文件中的函数原型,编写 ...
- Java利用JNI调用c++代码简易例子演示
点击打开链接 (提取码:8676) 一.首先简单交代一下两个问题: 1.什么是JNI - - - JNI的全名为Java Native Interface(Jav ...
最新文章
- 服务器上装centos系统花屏,CentOS系统如何解决鼠标花屏的问题
- matlab在电力行业中的仿真技术-MATLAB小电流接地系统单向故障仿真分析
- jquery 根据class名 赋值_jQuery简单用法!!!
- 依赖注入_引用其他的bean
- python返回unicode_我们如何从python中的字形id获取unicode?
- 【Ruby】Ruby 类案例
- php的文件包含总结 include require include_once require_once
- LeerCode 题 - 14. 最长公共前缀
- 针式打印机设置连续打印不分页_打印机的应用与耗材介绍
- npp夜光数据介绍 viirs_优化的NPP夜光月度数据下载
- 关乎Python lambda你也看得懂
- python2.0 s12 day4
- ubuntu14 lamp环境下安装swoole1.8.6
- atitit.编程语言 程序语言 的 工具性 和 材料性 双重性 and 语言无关性 本质
- 构建一个可行的BI系统的造价是多少,实施周期?具备条件基础是什么? 数据量有要求么
- 卢森堡携手欧洲航天局,在大公国建立独一无二的“欧洲太空资源创新中心”
- 学习软件测试必备的网站清单,建议收藏!
- 图片识别出处_搜图神器!你还在问图片的出处吗?
- js多线程编程web worker
- Aliyun 学习笔记(二)阿里云物联网平台介绍