当前位置: 首页 > 编程日记 > 正文

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

转载于:https://www.cnblogs.com/lujiango/p/8119617.html

相关文章:

【青少年编程】【三级】加法出题机

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

Python培训教程分享:Python异常机制

​ 在学习Python技术的时候&#xff0c;我们经常会遇到一些异常&#xff0c;例如导致程序在运行过程中出现的中断或退出&#xff0c;我们都称之为异常&#xff0c;大多数的异常都不会被程序处理&#xff0c;而是以错误信息的形式展现出来。本期Python培训教程就算教大家关于Pyt…

SharePoint【调试,诊错系列】-- 一种调试Sharepoint2010 Solution的快捷方式

Visual Studio 2010 支持通过F5来调试Sharepoint Solutions&#xff0c;但这种方法却很难用在调试workflows, event recievers, custom controls上&#xff0c;我们往往通过 "Attach to process..."来调试这些模块&#xff0c;关于如何Attach到正确的Process&#xf…

通往SQL Server复制的阶梯:一级- SQL服务器复制介绍

链接&#xff1a;http://www.sqlservercentral.com/articles/StairwaySeries/72274/ 文章&#xff1a;Stairway to SQL Server Replication: Level 1 - Introduction to SQL Server Replication 通往SQL Server复制的阶梯:一级- SQL服务器复制介绍 By Sebastian Meine, 2012/12…

【青少年编程】【三级】青蛙捕虫

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

UI培训教程分享:UI设计的分类有哪些?

本期为大家介绍的UI培训教程是关于UI设计分类这块的&#xff0c;在UI设计中&#xff0c;我们常应用到的终端设备可大致分为三类&#xff0c;分别为移动端UI设计、PC端UI设计、其他终端UI设计。 UI培训教程分享&#xff1a;UI设计的分类有哪些? 1. 移动端UI设计 移动端一般指移…

slider(滑动条)控件模版,样式--用图片定义控件模版

初接触wpf&#xff0c;想自己用图片做一个个性slider滑块控件&#xff0c;网上找了很久无果。后来一些机缘巧合看别人源码的时候找到了类似的&#xff0c;然后自己再查了一下msdn&#xff0c;大概弄懂了。 我们先来看看slider控件组成元素。 Slider控件组成&#xff1a; 用图片…

360浏览器调用selenium

2019独角兽企业重金招聘Python工程师标准>>> 360浏览器调用selenium package com.demo;import java.io.File; import java.io.IOException;import org.junit.Before; import org.junit.Test; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver;…

【组队学习】【28期】R语言数据科学

R语言数据科学 论坛版块&#xff1a; http://datawhale.club/c/team-learning/36-category/36 开源内容&#xff1a; https://github.com/datawhalechina/team-learning-program/tree/master/RLanguage 学习目标 向零基础的同学介绍如何利用R语言进行数据分析。通过学习&…

零基础参加Java培训班合适吗

零基础参加Java培训班合适吗?对于这个问题&#xff0c;首先答案是肯定的&#xff0c;零基础学习java技术最靠谱最快速的方法就是报java培训班进行学习了&#xff0c;来看看下面的详细介绍就知道了。 零基础参加Java培训班合适吗? 能够想到参加Java培训班学习的同学一般分为三…

用VS(c#)创建、调试windows service以及部署卸载

同事问到windows service的东东&#xff0c;现在整理一下&#xff0c;用c#如何创建一个windows service&#xff0c;以及如何调试、部署、卸载。 一、创建windows service 1. 打开VS2008&#xff0c;新建一个Project, Project类型选择Visual C#-Windows&#xff0c;在Templates…

【组队学习】【28期】基于Python的会员数据化运营

基于Python的会员数据化运营 论坛版块&#xff1a; http://datawhale.club/c/team-learning/37-category/37 开源内容&#xff1a; https://github.com/datawhalechina/team-learning-data-mining/tree/master/MemberOperations 学习目标 数据化运营是业务知识与编程技能…

异步系统接口调用流程图

2019独角兽企业重金招聘Python工程师标准>>> 异步系统接口调用流程图 博客分类&#xff1a; java ................................... 转载于:https://my.oschina.net/xiaominmin/blog/1597725

java培训教程分享:Java中用户如何自定义异常?

我们在学习java技术的时候应该有了解过&#xff0c;在java中是定义了很多的异常类的&#xff0c;虽然这些大量异常类可以帮助我们描述编程时出现的大部分异常情况&#xff0c;但是在程序开发中有时可能需要描述程序中特有的异常情况&#xff0c;例如在设计divide()方法时不允许…

【组队学习】【28期】基于transformers的自然语言处理(NLP)入门

基于transformers的自然语言处理(NLP)入门 论坛版块&#xff1a; http://datawhale.club/c/team-learning/39-category/39 开源内容&#xff1a; https://github.com/datawhalechina/Learn-NLP-with-Transformers 学习目标 自然语言处理&#xff08;Natural Language Pro…

java io在文件结尾持续添加内容

[代码] java io在文件结尾持续添加内容 public static void write(String path, String content) {try {File f new File(path);BufferedWriter output new BufferedWriter(new FileWriter(f,true));output http://www.szhaoexport.com/linked/20130222.do; .write(content &…

Docker1.12让容器使用和宿主机同一个网段

2019独角兽企业重金招聘Python工程师标准>>> Docker1.12让容器使用和宿主机同一个网段 博客分类&#xff1a; docker 由于开发的一些特殊需求&#xff0c;需要将容器部署在与宿主机同一个网段中&#xff0c;部署步骤如下&#xff1a;步骤一&#xff1a;创建网络$ …

java培训分享:java培训架构师学习线路图

本期java教程分享主要是讲解关于java培训架构师方面的内容&#xff0c;主要针对java架构师的学习线路图进行一个知识点的概括&#xff0c;下面来看看学习java架构师都需要了解哪些内容吧。 java培训分享&#xff1a;java培训架构师学习线路图 1、常见模式与工具 学习Java技术体…

设计中涉及到的dip、dp、px、sp等单位说明

在进行UI设计中常会遇到各种数值单位&#xff0c;开始使用时也常搞混&#xff0c;于是搜集了单位解说的文章与大家一同分享 dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关&#xff0c;一般我们为了支持WVGA、HVGA和QVGA 推荐使用…

【组队学习】【28期】Datawhale组队学习内容介绍

第28期 Datawhale 组队学习活动马上就要开始啦&#xff01; 本次组队学习的内容为&#xff1a; 吃瓜教程——西瓜书南瓜书李宏毅机器学习动手学数据分析集成学习SQL编程语言R语言数据科学基于Python的会员数据化运营数据采集从入门到精通基于transformers的自然语言处理(NLP)入…

多线程读一个全局变量要不要加锁?还是说只是当修改全局变量的时候才要加锁?...

如果所有线程都只读取该变量的话不必加锁&#xff0c;因为仅读取不存在破坏数据的风险&#xff0c;如果有线程写该变量的话不管读取还是写入都要加锁的。

java培训教程分享:Java编写软件代码自动提示功能

本期的java培训教程分享主要是介绍的java编写软件代码的一个自动提示功能&#xff0c;很多零基础和初学java的同学们对这一块还不是很了解&#xff0c;Eclipse for android 实现代码自动提示智能提示功能&#xff0c;以下是介绍 Eclipse for android。 java培训教程分享&#x…

iOS WebviewJavascriptBridge 源码研读笔记

这两天接近元旦&#xff0c;事情稍微少些&#xff0c;有些时间&#xff0c;索性写点什么&#xff0c;就从最擅长的iOS混合开发写起了&#xff0c;由于iOS开发经验不到四年吧&#xff0c;期间还搞了一年半的前端&#xff0c;有些知识可能还是积累的不足&#xff0c;能力不足&…

Debian上网的问题小结

装完系统或装系统中很重要的部分就是配置网络的问题了&#xff0c;记得刚安装Debian的时候还不知道dhclient eth0真是杯具。 关于怎么设置识别网卡su->输入root密码->nano /etc/network/interface然后分情况&#xff0c;如果你是有线的且只有一个网卡&#xff0c;就叫eth…

【组队学习】【28期】青少年编程(Scratch 一级)

青少年编程&#xff08;Scratch 一级&#xff09; 论坛版块&#xff1a; http://datawhale.club/c/team-learning/34-category/34 开源内容&#xff1a; https://github.com/datawhalechina/team-learning-program/tree/master/Scratch 学习目标 全国青少年软件编程等级考…

java培训教程分享:Java中怎样将数据对象序列化和反序列化?

本期为大家介绍的java培训教程是关于“Java中怎样将数据对象序列化和反序列化?”的内容&#xff0c;相信大家都知道&#xff0c;程序在运行过程中&#xff0c;可能需要将一些数据永久地保存到磁盘上&#xff0c;而数据在Java中都是保存在对象当中的。那么我们要怎样将对象中的…

C#实现的几种委托

//普通委托DeleteShow ds new DeleteShow(ShowName);Console.WriteLine("----------------------");Console.WriteLine("普通委托----请输入用户名:");string Name Console.ReadLine();Console.WriteLine(ds(Name));Console.WriteLine("-----------…

AFN框架使用整理

1.AFN框架基本使用 1 AFN内部结构 AFN结构体 NSURLConnection(iOS9.0废弃了) AFURLConnectionOperationAFHTTPRequestOperationAFHTTPRequestOperationManager(封装了常用的 HTTP 方法) 属性 baseURL :AFN建议开发者针对 AFHTTPRequestOperationManager 自定义个一个单例子类&a…

【青少年编程】【一级】小镇一日游

「青少年编程竞赛交流群」已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

参加java培训后,就业方向有哪些

参加java培训后&#xff0c;就业方向有哪些?很多正在参加java培训的同学对这个问题都比较关注&#xff0c;那么下面小编就针对这个问题为大家做下详细的介绍&#xff0c;希望能够帮助到大家。 参加java培训后&#xff0c;就业方向有哪些?首先我们来了解一下Java的应用领域&am…