java使用jnative jar包调用C/C++
2017-05-16 17:03
926 查看
最近学习了一下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 :头文件
保存。
再写array.c
保存
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代码:
结果:
test
a[0] = 1
a[1] = 2
a[2] = 3
a[3] = 4
a[4] = 9
这里,win7下 java 使用jnative 包调用 c 的简单demo完成了,
当然更复杂的功能编写实现,还需要我们继续学习。
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完成了,
当然更复杂的功能编写实现,还需要我们继续学习。
相关文章推荐
- java 使用jni调用本地c++类库
- 使用JNI进行混合编程:在Java中调用C/C++本地库
- [JNI] Eclipse直接完成JAVA调用C/C++ (Eclipse上使用CDT结合MinGW)
- java使用JNI调用C++代码(vs2010生成dll文件)
- 使用JNI进行Java与C/C++语言混合编程(1)--在Java中调用C/C++本地库
- Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤
- Android JNI 使用的数据结构JNINativeMethod详解 ||建立Android SDK下的JNI、JAVA应用完整步骤---Android JAVA调用C++代码
- linux下 使用JNI 来以C++调用JAVA的类!(一)
- linux下使用jni实现c++调用java程序(1)准备工作
- 关于C++调用jar包,在创建虚拟机时使用JNI_CreateJavaVM调用失败返回-1的问题
- windows7下,Java中利用JNI调用c++生成的动态库的使用步骤
- java调用C++代码-JNI的使用
- Android中简单的JNI使用,C++调用JAVA
- [JNI] Eclipse直接完成JAVA调用C/C++ (Eclipse上使用CDT结合MinGW)
- [JNI] Eclipse直接完成JAVA调用C/C++ (Eclipse上使用CDT结合MinGW)
- Java使用JNI调用C/C++的DLL动态链接库1
- Java使用JNI调用C/C++的DLL动态链接库2
- 使用JNI进行Java与C/C++语言混合编程(1)--在Java中调用C/C++本地库
- JAVA使用JNI调用C/C++动态库
- 使用JNI进行混合编程:在C/C++中调用Java代码