2、Java调用C语言(JNative法)
这个方法也是挺麻烦的……
一、下载JNative.jar,把它放在你jdk下的\jre\lib\ext目录下
二、在 F:\MinGW\JNative 新建 Test.java:
public class Test {
public static void main(String[] args) throws NativeException, IllegalAccessException {
// 例1
JNative n1 = new JNative("test.dll", "add");
n1.setRetVal(Type.INT);
n1.setParameter(0, 11); //C语言add函数的第一个参数是11
n1.setParameter(1, 9); //C语言add函数的第二个参数是9
n1.invoke(); //执行
int re1 = Integer.parseInt(n1.getRetVal()); //获取返回结果
System.out.println("例1:addresult = "+re1);
// 例2
JNative n2= new JNative("test.dll", "addArray");
int len=3;
//定义一个int指针p1,一个int占4个字节,(4 * len)可以理解成有len个int。若是double则(8 * len),以此类推
Pointer p1 = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * len));
Pointer p2 = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * len));
Pointer p3 = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * len));
p1.setIntAt(0, 11);p1.setIntAt(4, 18);p1.setIntAt(8, 21);
p2.setIntAt(0, 44);p2.setIntAt(4, 56);p2.setIntAt(8, 100);
n2.setRetVal(Type.VOID);
n2.setParameter(0, p1);
n2.setParameter(1, p2);
n2.setParameter(2, p3);
n2.setParameter(3, len);
n2.invoke();
for (int i = 0; i < len; i++) {
System.out.println("例2:addArray"+(i+1)+" = "+p3.getAsInt(i*4));
}
p1.dispose();
p2.dispose();
p3.dispose();
// 例3
JNative n3 = new JNative("test.dll", "stringFun");
n3.setRetVal(Type.STRING);
String inputString = "kun";
String outputString = "";
Pointer p4 = Pointer.createPointerFromString(inputString);
Pointer p5 = Pointer.createPointerFromString(outputString);
n3.setParameter(0, p4);
n3.setParameter(1, p5);
n3.invoke();
System.out.println("例3:outputString = "+n3.getRetVal()); p4.dispose(); p5.dispose();
}
}
三、再新建一个 test.c:
#include <stdio.h>
#include <malloc.h>
int add(int a, int b) {
return (a + b);
}
void addArray(int *a,int *b,int *c,int len) {
int i;
for(i=0;i<len;i++) {
c[i]=a[i]+b[i];
}
}
char* stringFun(char *str1,char *str2) {
printf("例3:intputString = %s\n",str1);
str2 = (char*)malloc(sizeof(char)*17);
str2 = "HG-U133_Plus_2.0";
return str2;
}
四、生成dll:
方法一:如果安装了MinGW
f: cd MinGW/JNative
gcc -Wall -shared test.c -o test.dll
javac Test.java
java Test
这时目录下新生成了JNativeCpp.dll、test.dll、Test.class
方法二:如果安装了Rtools(注意:我是Win7系统)
f: cd MinGW/JNative
R CMD SHLIB test.c
javac Test.java
java Test
这时目录下新生成了JNativeCpp.dll、test.dll、test.o、Test.class
结果:

2、Java调用C语言(JNative法)的更多相关文章
- 3、Java调用C语言(JNA法)
这个方法挺方便的……(改写“二.Java调用C语言(JNative法)“的例子) 一.访问https://github.com/twall/jna ,下载jna-4.1.0.jar(版本不同名字不同) ...
- 分享:写了一个 java 调用 C语言 开发的动态库的范例
分享:写了一个 java 调用 C语言 开发的动态库的范例 cfunction.h 代码#pragma once#ifdef __cplusplusextern "C" {#e ...
- JAVA调用C语言写的SO文件
JAVA调用C语言写的SO文件 因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 // 用JNI实现 // 实例: ...
- JAVA 调用 R 语言
1 简介 R是统计计算的强大工具,而JAVA是做应用系统的主流语言,两者天然具有整合的需要.关于整合,一方面,R中可以创建JAVA对象调用JAVA方法,另一方面,JAVA中可以转换R的数据类型调用R的 ...
- Java调用R语言
R是统计计算的强大工具,JAVA是做应用系统的主流语言.JAVA负责系统的构建,R用来做运算引擎,从而实现应用型和分析性相结合的系统. 一.Rserve(远程通信模式) Rserve是一个基于TCP/ ...
- JAVA 调用 R 语言之升华篇
由于项目的需要,最近做了一个javaWeb调用R的组件,在这里,我把自己走的一些弯路给大家总结一下: 一.选取什么插件作为java和R之间的通信? 1. 在传统的方式中,大致可以分为两类:一类是JRI ...
- 1、Java调用C语言(本地法)
这是一个比较麻烦的方法.. 一.首先,你要先安装一个VC,我的装在了D:\software\C++\Microsoft Visual Studio 二.我的jdk安装目录是D:\Program ...
- Java如何调用C语言程序,JNI技术
Java为什么要调用C语言编写的程序因为涉及操作系统底层的事件,Java是处理不了的,例如用户上传一个视频文件,需要后台给视频加上水印,或者后台分离视频流和音频流,这个事Java就做不了,只能交给C语 ...
- java调用dll-JNA
介绍 给大家介绍一个最新的访问本机代码的 Java 框架 —JNA . JNA(Java Native Access) 框架是一个开源的 Java 框架,是 SUN 公司主导开发的,建立在经典的 JN ...
随机推荐
- html acronym标签 语法
html acronym标签 语法 作用:定义首字母缩略词. 说明:如果首字母缩略词是一个单词,则可以被读出来,例如 NATO, NASA, ASAP, GUI.通过对只取首字母缩略词进行标记,您就能 ...
- #424 Div2 Problem C Jury Marks (二分 && 暴力 && std::unique && 思维)
题目链接 :http://codeforces.com/contest/831/problem/C 题意 :选手有一个初始积分,接下来有k个裁判为他加分或减分(时间顺序给出),然后告诉你n(1< ...
- [luogu]P2657低头一族[树状数组]
[luogu]P2657 低头一族 题目描述 一群青年人排成一队,用手机互相聊天. 每个人的手机有一个信号接收指标,第i个人的接收指标设为v[i]. 如果位置在x[i]的人要和位置在xj的人聊天,那么 ...
- Linux基本命令使用(一)
1.head -n 文件 可以查看文件前n行 tail -n 文件 可以查看文件的后n行 tail -f 文件 可以实时查看文件,比如日志在更新,就可以实时显示最后几行 ...
- js控制手机保持亮屏的库,解决h5移动端,自动息屏问题
一些说明:我用Laya(ts)开发小游戏,有需要保持手机屏幕常亮的需求(非必须的),然后作为小白的我就在网上找到了这个库,大概了解下,应该是通过播放空视频的原理来保持手机屏幕常亮,然后就放到项目中试了 ...
- Spring Data Jpa (四)注解式查询方法
详细讲解声明式的查询方法 1 @Query详解 使用命名查询为实体声明查询是一种有效的方法,对于少量查询很有效.一般只需要关心@Query里面的value和nativeQuery的值.使用声明式JPQ ...
- [BZOJ2839]:集合计数(组合数学+容斥)
题目传送门 题目描述 .(是质数喔~) 输入格式 一行两个整数N,K. 输出格式 一行为答案. 样例 样例输入: 3 2 样例输出: 样例说明 假设原集合为{A,B,C} 则满足条件的方案为:{AB, ...
- vue注
1.vue-cli3创建运行项目: vue-cli3可视化创建项目: vue ui vue-cli3创建项目:vue create elementUI(elementUI为项目名称) vue-cli3 ...
- nested exception is java.lang.OutOfMemoryError: PermGen space
原因: 持久带内存溢出. 方法:在启动的catalina.sh 里加上这个配置,增加持久带的大小. JAVA_OPTS="XX:PermSize=64M-XX:MaxPermSize=128 ...
- 对AC自动机+DP题的一些汇总与一丝总结 (2)
POJ 2778 DNA Sequence (1)题意 : 给出m个病毒串,问你由ATGC构成的长度为 n 且不包含这些病毒串的个数有多少个 关键字眼:不包含,个数,长度 DP[i][j] : 表示长 ...