JNI调用实例
1. 环境
Windows7-64Bit
VS2010-32Bit
JDK1.8-64Bit
2. 步骤
2.1 创建NativePrint类
public class NativePrint {
public native void nativePrint();
}
其中包含一个native方法,这个native方法是通过C++实现的,C++的实现代码最终是生成dll文件,然后通过Java调用。
2.2 编译NativePrint类以及生成头文件
使用命令javac NativePrint.java编译,然后在通过javah NativePrint命令生成头文件,具体如下:
命令:

生成的文件:

其中NativePrint.h的文件内容为:文件内容不可以修改
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class NativePrint */ #ifndef _Included_NativePrint
#define _Included_NativePrint
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: NativePrint
* Method: nativePrint
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_NativePrint_nativePrint
(JNIEnv *, jobject); #ifdef __cplusplus
}
#endif
#endif
2.3 C++实现NativePrint.nativePrint()方法
(1)安装VS2010版本,然后创建一个32位dll的空项目,具体步骤:文件 -> 新建项目 - > Win32 - > Win32控制台命令程序,然后下一步,做如下设置:


(2)拷贝
D:\Program Files\Java\jdk1.8.0_111\include\win32\jawt_md.h
D:\Program Files\Java\jdk1.8.0_111\include\win32\jni_md.h
D:\Program Files\Java\jdk1.8.0_111\include\jni.h
NativePrint.h
四个文件拷贝到D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include,备注:具体目录请参考自己本地的jdk和VS2010的安装目录;
(3)在native_print工程的源文件目录下,创建NativePrint.cpp文件,内容如下:

#include <jni.h>
#include <stdlib.h>
#include <NativePrint.h>
#ifdef __cplusplus
extern "C" {
#endif
/*这个方法名称一定要和头文件的一模一样,不过头文件中的参数只有类型,没有名称,需要加成如下参数*/
JNIEXPORT void JNICALL Java_NativePrint_nativePrint(JNIEnv *jenv, jobject jobj) {
/*就打印这一条语句*/
printf("=====888");
}
#ifdef __cplusplus
}
#endif
2.4 编译64位的dll文件
2.4.1 配置64的编译环境
因为整个环境都是在64位进行,而VS2010的默认创建的工程都是32位的,需要修改。备注:如果不使用64位的dll则会报错 java.lang.UnsatisfiedLinkError: D:\Program Files\Java\jdk1.8.0_111\bin\native_print.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform
(1)点击工具栏上面的配置管理器,如图

(2)找到“活动解决方案平台(P)”点击新建

(3)选择x64,然后保存即可。

2.4.2 编译
然后按F7,就可以在工程目录下面生成一个与工程同名的dll文件,如下:注意是在x64目录下面
备注:如果在运行过程中遇到如下错误:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏, 请参考http://blog.csdn.net/kevin_mqj/article/details/22981873

2.5 运行
将生成的dll文件拷贝到java.library.path目录下面,比如D:\Program Files\Java\jdk1.8.0_111\bin
创建一个测试java测试类,如Test.java
public class Test {
static {
System.loadLibrary("native_print");
}
public static void main(String[] args) {
new NativePrint().nativePrint();
}
}
然后运行Test.java
结果截图:

参考资料
http://blog.csdn.net/oscar999/article/details/7895367
http://blog.csdn.net/seanwang_25/article/details/17285505
http://blog.csdn.net/l527719041/article/details/77434652
http://blog.csdn.net/fenglibing/article/details/4300381
http://blog.csdn.net/kevin_mqj/article/details/22981873
https://stackoverflow.com/questions/8113080/cant-load-ia-32-bit-dll-on-a-amd-64-bit-platform
JNI调用实例的更多相关文章
- Android studio 下JNI编程实例并生成so库
Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...
- 移动mmbilling似乎有个BUG,通过JNI调用会抛出异常
有人用JNI调用过mm么?不知道你成功了没有,我试了多种方法,有一个错误始终存在,怀疑上个BUG.使用方式: 通过NativeActivity的clazz获取ClassLoader,然后找到mm.pu ...
- Android studio 下 JNI 开发实例
在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为“交叉编译”? 先看什么是 JNI?JNI 的全称就是 Java Native In ...
- Android Studio NDK开发-JNI调用Java方法
相对于NDK来说SDK里面有更多API可以调用,有时候我们在做NDK开发的时候,需要在JNI直接Java中的方法和变量,比如callback,系统信息等.... 如何在JNI中调用Java方法呢?就需 ...
- Android的JNI调用(二)
Android Studio 2.3在native下已经有了代码提示功能,按照提示下载相应组件就可以debug native代码. 一.Java调用JNI与JNI调用Java 1.1 C调用Java ...
- java native interface JNI 调用Java方法
在上一篇文章中介绍了JNI.以及java调用JNI.这篇讲一下 JNI调用java方法. 通过使用合适的JNI函数,你能够创建Java对象,get.set 静态(static)和 实例(instanc ...
- Android Jni 调用
Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:j ...
- ubuntu下Java通过JNI调用C
下面看一个实例,如下: public class TestJNI { static { System.loadLibrary("diaoyong"); // 程序在加载时,自动加载 ...
- 第39篇-Java通过JNI调用C/C++函数
在某些情况下,Java语言需要通过调用C/C++函数来实现某些功能,因为Java有时候对这些功能显的无能为力,如想使用X86_64 的 SIMD 指令提升一下业务方法中关键代码的性能,又或者想要获取某 ...
随机推荐
- 通过dbf文件恢复oracle
可能有些人会由于各种原因经常重装系统,但是系统里面总是有一些比较重要的软件在重装后就不能用了.比如oracle数据库,众所周知数据库如果通过dmp导入导出麻烦不说,还很耗时,特别是像笔者一个数据库就有 ...
- 《windows内核安全与驱动开发》ctrl2cap中的ObReferenceObjectByName疑问
国内有关于windows内核驱动这块的书籍实在是甚少,不过好在<windows内核安全与驱动开发>这本书还算不错(内容方面),但是不得不说这本书在许多地方存在着一些细节上的问题.比如我今天 ...
- 使用SQL_TRACE进行数据库诊断
SQL_TRACE是Oracle提供的用于进行SQL跟踪的手段,是强有力的辅助诊断工具.在日常的数据库问题诊断和解决中,SQL_TRACE是非常常用的方法.本文就SQL_TRACE的使用作简单探讨,并 ...
- [转]SQLSERVER存储过程调用不同数据库的数据_存储过程中通过链接服务器访问远程服务器
本文转自:http://blog.csdn.net/nnaabbcc/article/details/7967761 存储过程调用不同数据库的数据 在存储过程调用不同数据库的数据该如何做,比如在存储过 ...
- Linq之旅:Linq入门详解(Linq to Objects)【转】
http://www.cnblogs.com/heyuquan/p/Linq-to-Objects.html Linq之旅:Linq入门详解(Linq to Objects) 示例代码下载:Linq之 ...
- ISP图像调试工程师——tone Mapping(ISP)
http://www.cnblogs.com/bigbigtree/p/3458797.html
- Vue脚手架(vue-cli)搭建和目录结构详解
一.环境搭建 1.安装node.npm.webpack,不多说 2.安装vue-cli脚手架构建工具,打开命令行工具输入:npm install vue-cli -g,安装完成之后输入 vue -V( ...
- 解析PHP中如何将数组变量写入文件
在用PHP记录日志,或者是 Ajax 请求出错想要 debug 的时候.我们一般都会将信息写入到一个指定的文件当中.然后根据相应的信息来处理问题.比如笔者最喜欢在用 Ajax 取不到数据的时候,在PH ...
- CocoSourcesCS 2
CocoSourcesCS 2 /*------------------------------------------------------------------------- DFA.cs - ...
- redis学习笔记——命令执行流程
基础知识部分 如果需要掌握Redis的整个命令的执行过程,那么必须掌握一些基本的概念!否则根本看不懂,下面我就一些在我看来必备的基础知识进行总结,希望能为后面命令的整个执行过程做铺垫. 事件 Redi ...