这个方法也是挺麻烦的……

一、下载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法)的更多相关文章

  1. 3、Java调用C语言(JNA法)

    这个方法挺方便的……(改写“二.Java调用C语言(JNative法)“的例子) 一.访问https://github.com/twall/jna ,下载jna-4.1.0.jar(版本不同名字不同) ...

  2. 分享:写了一个 java 调用 C语言 开发的动态库的范例

    分享:写了一个 java 调用 C语言 开发的动态库的范例 cfunction.h   代码#pragma once#ifdef __cplusplusextern "C" {#e ...

  3. JAVA调用C语言写的SO文件

    JAVA调用C语言写的SO文件 因为工作需要写一份SO文件,作为手机硬件IC读卡和APK交互的桥梁,也就是中间件,看了网上有说到JNI接口技术实现,这里转载了一个实例 // 用JNI实现 // 实例: ...

  4. JAVA 调用 R 语言

    1 简介 R是统计计算的强大工具,而JAVA是做应用系统的主流语言,两者天然具有整合的需要.关于整合,一方面,R中可以创建JAVA对象调用JAVA方法,另一方面,JAVA中可以转换R的数据类型调用R的 ...

  5. Java调用R语言

    R是统计计算的强大工具,JAVA是做应用系统的主流语言.JAVA负责系统的构建,R用来做运算引擎,从而实现应用型和分析性相结合的系统. 一.Rserve(远程通信模式) Rserve是一个基于TCP/ ...

  6. JAVA 调用 R 语言之升华篇

    由于项目的需要,最近做了一个javaWeb调用R的组件,在这里,我把自己走的一些弯路给大家总结一下: 一.选取什么插件作为java和R之间的通信? 1. 在传统的方式中,大致可以分为两类:一类是JRI ...

  7. 1、Java调用C语言(本地法)

    这是一个比较麻烦的方法..   一.首先,你要先安装一个VC,我的装在了D:\software\C++\Microsoft Visual Studio   二.我的jdk安装目录是D:\Program ...

  8. Java如何调用C语言程序,JNI技术

    Java为什么要调用C语言编写的程序因为涉及操作系统底层的事件,Java是处理不了的,例如用户上传一个视频文件,需要后台给视频加上水印,或者后台分离视频流和音频流,这个事Java就做不了,只能交给C语 ...

  9. java调用dll-JNA

    介绍 给大家介绍一个最新的访问本机代码的 Java 框架 —JNA . JNA(Java Native Access) 框架是一个开源的 Java 框架,是 SUN 公司主导开发的,建立在经典的 JN ...

随机推荐

  1. python中pip相关命令

    用pip安装第三方包的命令 pip install xxx --user 用pip更新第三方包 pip install --upgrade xxx --user 用pip卸载第三方包 pip unin ...

  2. sublime安装完插件后出现的一些问题

    1.安装anaconda后代码前面出现小方框 解决办法:这是由于不符合PEP8代码规范,在空白地方右击,选择anaconda --> autoformat PEP8 Errors ,同时保证导入 ...

  3. sh_10_分隔线模块

    sh_10_分隔线模块 def print_line(char, times): """打印单行分隔线 :param char: 分隔字符 :param times: 重 ...

  4. 【Leetcode】买卖股票-贪心算法

    题目: 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必 ...

  5. VirtualBox NAT Host-only模式下,自动分配IP上网。

    修改宿主机上,virtualbox自建虚拟网卡Host-Only 2. 因为我使用了两个适配器,所以这两个适配器的名字分别是ifcfg-eth0, ifcfg-eth1. ifcfg-eh0一般默认就 ...

  6. Jmeter -- 参数化(函数助手和CSV数据文件配置)

    使用场景: 例如:模拟多用户登陆时 参数化两种方式: 方式一:使用函数助手 1. 创建包含多个登录名和密码的文件 可以在文本编辑器中输入,格式如下: username,passwordusername ...

  7. [CSP-S模拟测试]:彩球问题(记忆化搜索)

    题目传送门(内部题91) 输入格式 第一行一个正整数$N$,表示颜色种类数. 第二行$N$个正整数$k[i],k[i]$表示第$i$种颜色的数量$(1\leqslant k[i]\leqslant 3 ...

  8. 腾讯这套SpringMVC面试题你懂多少(面试题和答案)

    1.什么是 SpringMvc? 答:SpringMvc 是 spring 的一个模块,基于 MVC 的一个框架,无需中间整合层来整 2.Spring MVC 的优点: 答:1)它是基于组件技术的.全 ...

  9. SpringBoot(十二):SpringBoot整合Kafka

    https://blog.csdn.net/saytime/article/details/79950635

  10. spring +spring+ hibernate配置1

    这种配置方式是将Spring .SpringMVC.Hibernate三个模块分开配置,交叉引用!hibernate连接配置使用.properties文件 web.xml配置 <web-app ...