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调用实例的更多相关文章

  1. Android studio 下JNI编程实例并生成so库

    Android studio 下JNI编程实例并生成so库 因为公司需要为Android相机做美颜等图像后期处理,需要使用JNI编程,最近学了下JNI,并且在Android Studio下实现了一个小 ...

  2. 移动mmbilling似乎有个BUG,通过JNI调用会抛出异常

    有人用JNI调用过mm么?不知道你成功了没有,我试了多种方法,有一个错误始终存在,怀疑上个BUG.使用方式: 通过NativeActivity的clazz获取ClassLoader,然后找到mm.pu ...

  3. Android studio 下 JNI 开发实例

    在AS中进行 NDK 开发之前,我们先来简单的介绍几个大家都容易搞懵的概念: 到底什么是JNI,什么是NDK? 何为“交叉编译”? 先看什么是 JNI?JNI 的全称就是 Java Native In ...

  4. Android Studio NDK开发-JNI调用Java方法

    相对于NDK来说SDK里面有更多API可以调用,有时候我们在做NDK开发的时候,需要在JNI直接Java中的方法和变量,比如callback,系统信息等.... 如何在JNI中调用Java方法呢?就需 ...

  5. Android的JNI调用(二)

    Android Studio 2.3在native下已经有了代码提示功能,按照提示下载相应组件就可以debug native代码. 一.Java调用JNI与JNI调用Java 1.1 C调用Java ...

  6. java native interface JNI 调用Java方法

    在上一篇文章中介绍了JNI.以及java调用JNI.这篇讲一下 JNI调用java方法. 通过使用合适的JNI函数,你能够创建Java对象,get.set 静态(static)和 实例(instanc ...

  7. Android Jni 调用

    Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:j ...

  8. ubuntu下Java通过JNI调用C

    下面看一个实例,如下: public class TestJNI { static { System.loadLibrary("diaoyong"); // 程序在加载时,自动加载 ...

  9. 第39篇-Java通过JNI调用C/C++函数

    在某些情况下,Java语言需要通过调用C/C++函数来实现某些功能,因为Java有时候对这些功能显的无能为力,如想使用X86_64 的 SIMD 指令提升一下业务方法中关键代码的性能,又或者想要获取某 ...

随机推荐

  1. win7与Ubuntu 13.04双系统修改启动项顺序

    在在win7下安装了Ubuntu 13.04后,在grub中,win7启动想是最后一个,为了把win7设置为默认启动项,需要更改grub设置.google了半天,发现更改/etc /default/g ...

  2. 诡异的 "密码取回" 邮件问题

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  3. SpringMVC_入门项目

    本项目是SpringMVC的入门项目,用于演示SpringMVC的项目配置.各层结构,功能较简单 一.Eclipse中创建maven项目 二.pom.xml添加依赖 1 2 3 4 5 6 7 8 9 ...

  4. Openshift 3.6 安装

    因为有客户需求,所以必须尝试一下,可悲的是手里只有3.7的离线安装文档,加上之前3.11安装因为同事文档写得太好,基本没遇到什么坑,所以就没仔细研究就开始搞了. 结果果然是因为/etc/ansible ...

  5. ylbtech-LanguageSamples-Versioning(版本控制)

    ylbtech-Microsoft-CSharpSamples:ylbtech-LanguageSamples-Versioning(版本控制) 1.A,示例(Sample) 返回顶部 “版本控制”示 ...

  6. SQL盲注测试高级技巧

    写在前面: 这篇文章主要写了一些加快盲注速度的技巧和盲注中比较精巧的语句,虽然注入并不是什么新技术了.但是数据库注入漏洞依然困扰着每一个安全厂商,也鞭策着每一个安全从业者不断前进. 正文: 首先来简单 ...

  7. XmlRpc with C#/Java【转】

    最近看了几个项目都是用xmlrpc协作完成的,就做了几个测试客户端和服务器端和大家一起分享.希望能对入门的同学有帮助 关于xmlrpc的介绍和规范参考http://www.xml-rpc.net/ 下 ...

  8. DX12

    CD3DX12_DESCRIPTOR_RANGE1 的baseShaderRegister 用来指定 t0 t1 b0 b1...的index t0 srv b0 constant buffer u0 ...

  9. asset bundle打包策略

    一次引用的 不单独打包 2次的看大小 小的不单独打包 2次以上单独打包 2这个值 可以测一测 取平衡

  10. TensorFlow环境搭建及安装教程

    1.安装虚拟环境virtualenv相关配置(创建了python3.5的环境) 2.http://docs.nvidia.com/cuda/cuda-installation-guide-linux/ ...