java使用jnative jar包调用C/C++

最近学习了一下win7系统下java调用C语言写的代码,做个总结。
java调用C语言的DLL文件有多种方法
1)JNA—java native方法
2)JNI—java native interface
3)jnative.jar 包
详细参考:
http://blog.csdn.net/ranmudaofa/article/details/9798779

1、我的电脑是win7 64位系统,安装的jdk也是64位,后来始终提示
运行的时候总是报错
JNative library not loaded, sorry !
JNative library not loaded, sorry !
JNative library not loaded, sorry !
JNative library not loaded, sorry !

试了各种方法,把
JNativeCpp.dll 放到 C:\Windows\System32
、jdk/bin 目录都特么不行,一直报错,
简直要崩溃了,后来找到一篇文章:
http://blog.csdn.net/longtingjing/article/details/44541649
把64位jdk换成32位jdk 成功了!!!!我擦,真坑啊

2、网上说java调用的C语言文件需要下载
Visual Studio 2010 ,谁特么有功夫下载这么大的编辑器。。。
于是搜索了一些文章,推荐使用MINGW c/c++ 编译工具。
https://sourceforge.net/projects/mingw/
这里写图片描述

这个是免安装版,下载完之后把路径配置到环境变量里面,我的如下:
Path
C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\RSA SecurID Token Common;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Users\LocalUser\Desktop\adt-bundle-windows-x86-20140702\adt-bundle-windows-x86-20140702\sdk\platform-tools;%JAVA_HOME%\bin;%java_home%\jre\bin;%adb%;C:\Users\lihui20\Downloads\mingw\bin;

注意C:\Users\lihui20\Downloads\mingw\bin;
添加之后可以
使用cmd,在任何路径选使用
强大的 gcc命令。

3、下载JNative 压缩包。
http://sourceforge.NET/projects/jnative/
最好下载所以文件(3个)
这里写图片描述

Jnative.jar 这个是必须要的,java代码里面会用到。
jnativecpp.dll 后来发现我这个没有其实也可以。网友说最新的Jnative.jar 里面已经包含后jnativecpp.dll 这个文件。经过验证发现确实如此:
这里写图片描述
lib-bin存在这个文件。不需要再添加了

libjnativecpp.so 这个是linux下使用,也就是android 手机开发app使用的。

3、写c文件。我的例子,一个菜鸟,写的比较简单,java输入一个数组,C语言打印。
array.h :头文件

    #ifndef MINGW_DLL_H__  
    #define MINGW_DLL_H__  
    void add(int a[5]);  
    #endif  

保存。

再写array.c

#include <stdio.h>  
#include "array.h"  
 void add(int a[5]){  
  //1.for循环遍历  
  int i=0;
    for (i = 0; i <5; i++)  
    {  
        printf("a[%d] = %d\n",i ,a[i]);  
    } 

} 

保存
4、使用gcc命令生成 .dll 动态库文件,给java调用
C:>gcc -Wall -shared array.c -o array.dll
注意:上面的array.c array.h文件在一个目录下,我的是在
C:\ 下面。
自动生成array.dll文件。

5、把array.dll放到当前项目的最外层目录下(不放在这也可以,使用绝对路径)。
我的是:E:\ecplicespace\FileExplorer-master\testjni\
如果array.dll文件放的路径不对,会提示:
test
Exception in thread “main” org.xvolks.jnative.exceptions.NativeException: DLL d:\array.dll not found
at org.xvolks.jnative.JNative.nLoadLibrary(Native Method)
at org.xvolks.jnative.JNative.loadLibrary(JNative.java:545)
at org.xvolks.jnative.JNative.(JNative.java:521)
at org.xvolks.jnative.JNative.(JNative.java:440)
at com.study.jnilearn.Test.testJNative(Test.java:14)
at com.study.jnilearn.Test.main(Test.java:50)

java代码:

package com.study.jnilearn;

import org.xvolks.jnative.JNative;
import org.xvolks.jnative.exceptions.NativeException;
import org.xvolks.jnative.pointers.Pointer;
import org.xvolks.jnative.pointers.memory.MemoryBlockFactory;

public class Test {
    public static int testJNative(int a[]) throws NativeException,
            IllegalAccessException {

        JNative n = null;
        try {
        //这里可以使用绝对路径 
            n = new JNative("c:\\array.dll", "add");
            // n.setRetVal(Type.VOID);
            // // n.setParameter(0, a);
            // // n.setParameter(1, b);
            // n.set
            // n.invoke();
            // System.out.println("返回:" + n.getRetVal());
            // 为数组创建空间
            Pointer aArrIntInput = new Pointer(
                    MemoryBlockFactory.createMemoryBlock(4 * a.length));

            // 初始化数组
            for (int i = 0; i < a.length; i++) {
                aArrIntInput.setIntAt(4 * i, a[i]);
            }

            // 设定传入参数
            n.setParameter(0, aArrIntInput); // 数组指针
            // n.setParameter(1, a.length); // 数组大小

            // 设定返回类型
            // n.setRetVal(Type.VOID);

            // 调用DLL
            n.invoke();
            // return Integer.parseInt(n.getRetVal());
        } finally {
            if (n != null)
                n.dispose();
        }
        return 0;
    }

    public static void main(String[] args) throws NativeException,
            IllegalAccessException {
        System.out.println("test");
        testJNative(new int[] { 1, 2, 3, 4, 9 });

        // System.loadLibrary("array");
        // Value v=new Value();
        // int a[]={1,2,3,4};
        // int b[]={6,7,8,9};
        // v.add(a);
    }
}

结果:
test
a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 9

这里,win7下 java 使用jnative 包调用 c 的简单demo完成了,
当然更复杂的功能编写实现,还需要我们继续学习。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注:下文中的 *** 代表文件名中的版本号。 # 【jna-***.jar中文文档.zip】 中包含: 中文文档:【jna-***-javadoc-API文档-中文(简体)版.zip】 jar包下载地址:【jna-***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【jna-***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【jna-***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【jna-***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: jna-***.jar中文文档.zip,java,jna-***.jar,net.java.dev.jna,jna,***,com.sun.jna,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【jna-***.jar中文文档.zip】,再解压其中的 【jna-***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件; # Maven依赖: ``` <dependency> <groupId>net.java.dev.jna</groupId> <artifactId>jna</artifactId> <version>***</version> </dependency> ``` # Gradle依赖: ``` Gradle: implementation group: 'net.java.dev.jna', name: 'jna', version: '***' Gradle (Short): implementation 'net.java.dev.jna:jna:***' Gradle (Kotlin): implementation("net.java.dev.jna:jna:***") ``` # 含有的 Java package(包)(此处仅列举3个): ``` com.sun.jna com.sun.jna.internal com.sun.jna.platform ...... ``` # 含有的 Java class(类)(此处仅列举3个): ``` com.sun.jna.AltCallingConvention com.sun.jna.Callback com.sun.jna.Callback.UncaughtExceptionHandler ...... ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值