java调用c/c++代码简单实现以及遇见的坑
以下内容均来自互联网,感谢你们的分享,我只是使用的时候看这方便,可以称呼我“搬运工”
如有不合适的地方请与我联系,我会及时改正
首先你可能会遇见以下错误
第一个错误是你在vs编译器没有选择使用release版的,而是用debug版的
详细见http://blog.csdn.net/niuxinlong/article/details/4176612
F:\java>java testdll
Exception in thread "main" java.lang.UnsatisfiedLinkError: F:\java\testdll.dll:
应用程序无法启动,因为应用程序的并行配置不正确。有关详细信息,请参阅应用程序事件
日志,或使用命令行 sxstrace.exe 工具。
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:)
at java.lang.Runtime.loadLibrary0(Runtime.java:)
at java.lang.System.loadLibrary(System.java:)
at testdll.<clinit>(testdll.java:)
第二个是在64位运行了一个32位dll
C:\testjni\testdll\x64\Debug>java testdll
Exception in thread "main" java.lang.UnsatisfiedLinkError: C:\testjni\testdll\x6
\Debug\testdll.dll: Can't load AMD 64-bit .dll on a IA 32-bit platform
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:)
at java.lang.Runtime.loadLibrary0(Runtime.java:)
at java.lang.System.loadLibrary(System.java:)
at testdll.<clinit>(testdll.java:)
Could not find the main class: testdll. Program will exit.
第三个当然是编码问题喽,编译class时使用encoding参数
C:\Users\Dmeck\Desktop\Java\winbox>javac -encoding gb2312 Testwin.java C:\Users\Dmeck\Desktop\Java\winbox>java Testwin 中文乱码
—————————————————————Body———————————————————————————————————
好了下面一个xp简单实现,
环境:java1.6、MinGw、sublime、xp32、vs2008
在硬盘准备一个目录

编写一个java加载JNi的本地实现
testdll.java
public class testdll
{
static
{
System.loadLibrary("testdll");
}
public native static int get();
public native static void set(int i);
public static void main(String[] args)
{
testdll test = new testdll();
test.set(10);
System.out.println(test.get());
}
}
cmd进入以上目录
运行
javac testdll.java
得到class
javah testdll
得到c的头文件
此处有两种方式:
一个把java安装目录的include目录
jni.h以及32目录下的jni_md.h复制当前工作目录
第二个是直接进行下一步
下一步:查看并修改刚刚编译的头文件testdll.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class testdll */ #ifndef _Included_testdll
#define _Included_testdll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: testdll
* Method: get
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_testdll_get
(JNIEnv *, jclass); /*
* Class: testdll
* Method: set
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_testdll_set
(JNIEnv *, jclass, jint); #ifdef __cplusplus
}
#endif
#endif
修改全局引用为本地目录引用
#include <jni.h>
改为
#include ”jni.h“
之后在当前目录编写cpp实现头文件的方法
#include "testdll.h"
int i = ;
JNIEXPORT jint JNICALL Java_testdll_get(JNIEnv *, jclass)
{
return i;
} JNIEXPORT void JNICALL Java_testdll_set(JNIEnv *, jclass, jint j)
{
i = j;
}
接着运行gcc
以下是博客参考博客地址
https://www.zhihu.com/question/36666057/answer/68516501
事实上很多情况下那样调用都是不成功的,生成dll代码一般这样最完整
gcc -Wl,--add-stdcall-alias -I "C:\Program Files\Java\jdk1.6.0_31\include" -I "C:\Program Files\Java\jdk1.6.0_31\include\win32" -shared -o testdll.dll testdll.cpp
C:\Documents and Settings\Administrator\桌面\java1>gcc -m64 -Wl,--add-stdcall-al
ias -I "C:\Program Files\Java\jdk1.6.0_31\include" -I "C:\Program Files\Java\jdk
1.6.0_31\include\win32" -shared -o testdll.dll testdll.cpp
testdll.cpp::: sorry, unimplemented: -bit mode not compiled in
#include "testdll.h"
所以这时候用编译工具最合适了vs2008很老,但相关博客比较多
C:\Documents and Settings\Administrator\桌面\java1>java testdll
下面介绍vs2008下编译64位
参考http://blog.csdn.net/a_little_e/article/details/45397557
——————————————————————————END——————————————————————————————————
同样最后我们只需要三个文件
testdll.class、testdll32.dll、testdll64.dll
当然testdll.class需要对应的testdll.java源码,来修改
System.loadLibrary("testdll");
对应的加载库
java调用c/c++代码简单实现以及遇见的坑的更多相关文章
- JNI_最简单的Java调用C/C++代码
JNI_最简单的Java调用C/C++代码 JNI.是Java Native Interface的简称,中文是"Java本地调用".通过这种技术能够做到下面两点: Java程序中的 ...
- JAVA调用c/c++代码
JNI是Java Native Interface的缩写,中文为JAVA本地调用.使用JNI可以很方便的用我们的Java程序调用C/C++程序.很多时候,某些功能用Java无法实现,比如说涉及到底层驱 ...
- 最简单的Java调用C/C++代码的步骤
1)首先在Java类中声明一个native的方法 (2)使用javah命令生成包含native方法声明的C/C++头文件 (3)按照生成的C/C++头文件来写C/C++源文件 (4)将C/C++源文件 ...
- java调用webservice,比较简单方便的方法。
首先,请同学们自行了解webservice的基础知识. 个人理解,webservice约等于使用http+xml技术进行跨平台的数据交互. http和xml我们都很熟悉了,把他们两个组合到一起就是we ...
- java调用c++函数的简单笔记
java使用jni调用c++动态库函数. 步骤: 1.编写java测试代码如下: public class CallNativeDemo { native void func(); native do ...
- Java调用WebService就是这么简单
https://cloud.tencent.com/developer/article/1080966
- java调用第三方命令,process.waitfor()挂起(你不知道的坑)
我们常在java中运行第三方程序,如sh.python,java提供一个Runtime.exec()方法,生成一个Process对象.今天在使用这个方法的时候,发现接口半天没有返回数据.查了一下,原来 ...
- (转)java调用python脚本
这篇博客旨在吐血分享今天遇到的java调用python脚本遇到的坑,折腾了3个多小时终于可以跑通了,代码超级短,但网上的好多资料都是抄来抄去的,很少有能够直接跑通的,尤其是针对你的python文件中用 ...
- java调用kettle_导入jar包(1)
版权声明:本文为博主原创文章,未经博主允许不得转载. Java调用Kettle执行任务或转换,需要使用Kettle中的jar,可以先导入lib目录中的几个基本的jar,如:kettle-core.ja ...
随机推荐
- c# .NET RSA结合AES加密服务端和客户端请求数据
这几天空闲时间就想研究一下加密,环境是web程序,通过js请求后台返回数据,我想做的事js在发送请求前将数据加密,服务端收到后解密,待服务端处理完请求后,将处理结果加密返回给客户端,客户端在解密,于是 ...
- SQL Server数据库的基础脚本编程
数据库脚本的基础编程 Go批量处理语句 用于同时处理多条语句 use指定数据库或表 use master --创建数据库 go use Student --创建表(Student)表示数据库 go 创 ...
- c++define的用法
c++define的用法 在写程序时经常会碰到这样一个问题,我们需要重复写很多相同的代码,并且这些代码结构相同.总是想自己把这段代码封装一下然后直接进行调用,但是如果这段代码逻辑并不复杂,并且代码 ...
- django系列4.2--自定义标签, 自定义过滤器, inclusion_tag, 引入静态文件(css,js等)
项目的目录为 在app中创建templates时,最好要再创建一个app名相同的文件夹,因为项目找文件时从第一个app开始遍历,不同app内的同名文件会有冲突,所以这样处理 一.自定义标签和过滤器 1 ...
- 【OCP-12c】2019年CUUG OCP 071考试题库(80题)
80.View the exhibit and examine the structure in ORDERS and ORDER_ITEMS tables. You need to create a ...
- PHP中count()和sizeof()
php中获取数组长度函数有两个count()和sizeof(),如果传递给这个函数的数组是一个空数组,或者是一个没有经过设定的变量,返回的数组元素个数就是0.两函数功能一样,手册上讲,sizeof() ...
- apollo配置中心初探
近在搞微服务框架的开发,需要有一个配置中心来满足统一管理业务应用以及组件的配置,在此期间也使用了多个配置中心比如:spring cloud config,自研的配置中心,当然还有apollo. spr ...
- mxonline实战15,用户中心:我的课程, 我的收藏,我的消息,登出和点击数以及收藏数
对应github地址:第15天 一. 我的课程 1. 继承usercenter-base页面 2. 编写url, view
- SAE实践——创建简单留言板
1. 创建数据库 将mysaeapptest的数据库初始化之后,建立新的数据库,在PHPMyAdmin输入下列SQL. CREATE TABLE IF NOT EXISTS `ny_diary` ( ...
- 【OpenCV3】直线拟合--FitLine()函数详解
一.FitLine()函数原型 CV_EXPORTS_W void fitLine( InputArray points, // 待输入点集(一般为二维数组或vector点集) OutputArray ...