以下内容均来自互联网,感谢你们的分享,我只是使用的时候看这方便,可以称呼我“搬运工”

如有不合适的地方请与我联系,我会及时改正

首先你可能会遇见以下错误

第一个错误是你在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

当然本例是winxp32位默认编译是32位dll

以下是博客参考博客地址
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
当你使用gcc的-m64编译64位dll会出现
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很老,但相关博客比较多

 
本例是在windows下做的,生成的是dll文件。并且名称要与java中需要调用的一致,这里就是testdll.dll (跟testdll.java没有关系)
把testdll.dll 拷贝到testdll.class的目录下,java testdll运行它,就可以观察到结果了
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++代码简单实现以及遇见的坑的更多相关文章

  1. JNI_最简单的Java调用C/C++代码

    JNI_最简单的Java调用C/C++代码 JNI.是Java Native Interface的简称,中文是"Java本地调用".通过这种技术能够做到下面两点: Java程序中的 ...

  2. JAVA调用c/c++代码

    JNI是Java Native Interface的缩写,中文为JAVA本地调用.使用JNI可以很方便的用我们的Java程序调用C/C++程序.很多时候,某些功能用Java无法实现,比如说涉及到底层驱 ...

  3. 最简单的Java调用C/C++代码的步骤

    1)首先在Java类中声明一个native的方法 (2)使用javah命令生成包含native方法声明的C/C++头文件 (3)按照生成的C/C++头文件来写C/C++源文件 (4)将C/C++源文件 ...

  4. java调用webservice,比较简单方便的方法。

    首先,请同学们自行了解webservice的基础知识. 个人理解,webservice约等于使用http+xml技术进行跨平台的数据交互. http和xml我们都很熟悉了,把他们两个组合到一起就是we ...

  5. java调用c++函数的简单笔记

    java使用jni调用c++动态库函数. 步骤: 1.编写java测试代码如下: public class CallNativeDemo { native void func(); native do ...

  6. Java调用WebService就是这么简单

    https://cloud.tencent.com/developer/article/1080966

  7. java调用第三方命令,process.waitfor()挂起(你不知道的坑)

    我们常在java中运行第三方程序,如sh.python,java提供一个Runtime.exec()方法,生成一个Process对象.今天在使用这个方法的时候,发现接口半天没有返回数据.查了一下,原来 ...

  8. (转)java调用python脚本

    这篇博客旨在吐血分享今天遇到的java调用python脚本遇到的坑,折腾了3个多小时终于可以跑通了,代码超级短,但网上的好多资料都是抄来抄去的,很少有能够直接跑通的,尤其是针对你的python文件中用 ...

  9. java调用kettle_导入jar包(1)

    版权声明:本文为博主原创文章,未经博主允许不得转载. Java调用Kettle执行任务或转换,需要使用Kettle中的jar,可以先导入lib目录中的几个基本的jar,如:kettle-core.ja ...

随机推荐

  1. ceph: health_warn clock skew detected on mon的解决办法

    造成集群状态health_warn:clock skew detected on mon节点的原因有两个,一个是mon节点上ntp服务器未启动,另一个是ceph设置的mon的时间偏差阈值比较小. 排查 ...

  2. ansible 之条件语句 when

    注册变量: 变量的另一个用途是将一条命令的运行结果保存到变量中,供后面的playbook使用.例如: - hosts: webservers tasks: - shell: /usr/bin/foo ...

  3. java学习笔记—第三方数据库连接池包1(29)

    第一步:导入dbcp包 第二步:通过核心类连接数据 BasicDataSource它是javax.sql.DataSrouce的子类. 一个工具类:BasicDataSourceFactory. 手工 ...

  4. [agc006f] Blackout 神题

    Description ​ 给你一个NN行NN列的网格,第ii行第jj列的格子用(i,j)(i,j)表示 一开始的时候有MM个格子被涂成黑色,其他的格子都是白色,具体一点,涂成黑色的格子为(a1,b1 ...

  5. jmeter进行https协议的测试

    一.HTTPS和HTTP的区别     超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息.HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和 ...

  6. blueborne漏洞的联想

    本文作者:ice 0X00前言 昨天看到blueborne的漏洞,顺手给我的nexus6装了一个app,测试了一下,一脸懵逼,怎么修复啊,然后我联想了一下, 还有哪些协议和传输是我们身边的威胁了,于是 ...

  7. [转载] 解决gns3 for mac模拟器三层交换机无法成功创建vlan的问题

    1.删除之前导入的ios: 2.选择GNS3--Edit--Preferences--IOS routers--New--导入ios-- 勾选This is an EtherSwitch router ...

  8. 总结day13 ----内置函数

    内置函数 我们一起来看看python里的内置函数.什么是内置函数?就是Python给你提供的,拿来直接用的函数,比如print,input等等.截止到python版本3.6.2,现在python一共为 ...

  9. 为阿里云域名配置免费SSL支持https加密访问简单教程

    阿里云之前有免费ssl入口申请,现在已经关闭了.那么现在怎么为自己的域名配置https呢? 首先打开阿里云域名控制台,如以下界面.(这里暂且用我的这个域名讲解吧)  如上图点击ssl证书,点击单域名免 ...

  10. GDB:从单线程调试到多线程调试(MFiX单步调试)

    GDB:从单线程调试到多线程调试 1. 裸跑GDB 1.1 安装GDB sudo apt-get install gdb 1.2 编译程序 由于需要调试,因此编译的时候需要添加-g编译参数: 1.3 ...