JNI笔记1
一、什么是JNI
Java Native Interface(JNI)是Java语言的本地编程接口
是 Java 与操作系统本地代码互相调用的功能的接口
二、Java 调用C/C++步骤:
1、在Java类中声明native方法
新建一个 Java 工程 TestNativeCode 包 com.fomagic 类 Testnative
package com.fomagic;
public class TestNative {
public native void sayHello(); //C++本地代码实现
public static void main(String[] args) {
}
}
2、使用javah命令生成包含native方法定义的C/C++头文件


3、按照生成的C/C++头文件来写C/C++ 源文件
1) 在VS 中新建 Win32控制台应用程序 –> 确定 –> 下一步(即选择应用程序设置)
2) 拷贝三个文件到 项目目录下
com_fomagic_TestNative.h 第2步生成的头文件
jni.h 位于 JDK 下的 include 文件目录中
jni_md.h include—>win32 目录
3) 添加现有项 com_fomagic_TestNative.h 引入头文件(如图)
4) 新建 源文件 source.cpp 添加如下内容
5) 注意 引用的头文件“ <> ”代表从系统查找 、 “ ” “ ” 优先从本地查找



#include "com_fomagic_TestNative.h"
#include <iostream>;
using namespace std; //对 com_fomagic_TestNative.h 中声明的方法定义
JNIEXPORT void JNICALL Java_com_fomagic_TestNative_sayHello (JNIEnv *evn, jobject obj)
{
cout<<"Hello World !"<<endl;
}
4、将C/C++源文件编译成动态链接库(DLL)可执行二进制代码
执行生成解决方案,在项目目录下的Debug 生成 DLL 文件
5、把DLL文件所在路径添加到PATH环境变量下
这个配置过Java环境变量的都应该是清楚的 , 这样可以方便Java程序直接调用当前的动态链接库
注意:需要注意的是Eclipse开发Java程序需要重启 来重新加载环境变量
6、java 类中加载DLL,然后调用声明的native方法
package com.fomagic;
public class TestNative {
public native void sayHello(); //C++本地代码实现
public static void main(String[] args) {
System.loadLibrary("NativeCode"); //加载动态链接库,不能加 .dll
TestNative test=new TestNative();
test.sayHello();
}
}
7、运行Java 项目
1) 执行结果 : Hello World !
2) 异常信息 : Can’t load IA 32-bit .dll on a AMD 64-bit platform
解决办法:
前文中提到的的Java引用DLL动态链接库时,执行结果的 异常信息为: Can’t load IA 32-bit .dll on a AMD 64-bit platform
原因:由于你的windows操作系统是64位,win32控制台程序默认生成 32位的 DLL 动态链接库
解决办法: 可想而知我们需要一个64位的DLL动态链接库,那就来生成一个
1、通过原来的VS项目 配置 (如图)


2、这时候生成则在 项目目录—-> x64 —-> Debug 目录 生成 NativeCode.dll
3、同理,把DLL文件所在路径添加到PATH环境变量下 ,方便Java程序加载, Eclipse则需要重启重新加载环境变量
三、弊端及注意点
- 使用JNI,这个java Application 将不能跨平台,如果要移植到别的平台上,则 native代码需要重新进行编写
- java是强类型语言,而C/C++则不是,因此,必须在写JNI时更加小心
- 在构建java程序的时候,尽量少用本地代码
转自:http://www.fomagic.com/index.php/232.html
JNI笔记1的更多相关文章
- JNI笔记之 初体验
Java Native Interface提供了java与c语言写的代码之间互相调用的方式.在c语言方面jni.h中声明了许多的类型和方法,有很多java的数据类型和c语言类型的转换方法函数. jav ...
- JNI笔记
由于要做一个能够加红字体的dialog,而cocos2d中的CCMessageBox是系统内带的,我无法修改其字体颜色.事实上是可以修改的,通过观察发现CCMessageBox被调用后,在安卓平台中会 ...
- Ubuntu 16.04 安装opencv3.4.5/cuda/caffe并使用jni笔记
因操作失误,误卸开发机NVIDIA显卡驱动,先更新操作日志如下: 1>NVIDIA驱动重装 1.卸载系统里的Nvidia残余 sudo apt-get purge nvidia* 2.把显卡驱动 ...
- 【Android Studio安装部署系列】二十五、Android studio使用NDK生成so文件和arr文件
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio使用ndk的简单步骤. NDK环境搭建 下载NDK 下载链接:https://developer.and ...
- 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化
第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...
- 《android开发艺术探索》读书笔记(十四)--JNI和NDK编程
接上篇<android开发艺术探索>读书笔记(十三)--综合技术 No1: Java JNI--Java Native Interface(java本地接口),它是为了方便java调用C. ...
- JNI学习笔记_Java调用C —— 非Android中使用的方法
一.学习笔记 1.java源码中的JNI函数本机方法声明必须使用native修饰. 2.相对反编译 Java 的 class 字节码文件来说,反汇编.so动态库来分析程序的逻辑要复杂得多,为了应用的安 ...
- JNI学习笔记_C调用Java
一.笔记 1.C调用Java中的方法,参考jni.pdf pg97可以参考博文:http://blog.csdn.net/lhzjj/article/details/26470999步骤: a. 创建 ...
- JNI学习笔记_Java调用C —— Android中使用的方法
一.笔记 1.JNI(Java Native Interface),就是如何使用java去访问C/C++编写的那些库.若想深入了解JNI可以看官方文档jni.pdf.优秀博文:Android JNI知 ...
随机推荐
- iOS开发之窥探UICollectionViewController(五) --一款炫酷的图片浏览组件
本篇博客应该算的上CollectionView的高级应用了,从iOS开发之窥探UICollectionViewController(一)到今天的(五),可谓是由浅入深的窥探了一下UICollectio ...
- phpstorm 63342默认端口怎么修改
phpstorm进行网页调试的时候,默认是加端口号63342,在配置本地php环境的时候默认端口不一定是63342这个,更多的是系统默认的端口号80,那么问题就出现了,如何在phpstorm中将633 ...
- C# 提取Word文档中的图片
C# 提取Word文档中的图片 图片和文字是word文档中两种最常见的对象,在微软word中,如果我们想要提取出一个文档内的图片,只需要右击图片选择另存为然后命名保存就可以了,今天这篇文章主要是实现使 ...
- 設置Linux保留物理內存並使用 (1)
在Linux系統中可以通過memblock來設置系統保留物理內存,防止這些內存被內存管理系統分配出去. 作者: 彭東林 郵箱: pengdonglin137@163.com 平臺 硬件平臺: TQ24 ...
- Mongoose使用案例--让JSON数据直接入库MongoDB
目录 1.准备工作. 2.配置Mongoose. 3.创建目录及文件. 4.插入数据,POST提交JSON增加一条记录. 5.查询数据,取出你插入数据库的记录. 一.准备工作 使用Express4创建 ...
- 【JVM】JVM系列之内存模型(六)
一.前言 经过前面的学习,我们终于进入了虚拟机最后一部分的学习,内存模型.理解内存模型对我们理解虚拟机.正确使用多线程编程提供很大帮助.下面开始正式学习. 二.Java并发基础 在并发编程中存在两个关 ...
- 3.Struts2配置文件标签介绍
Struts2的很多核心功能都是由拦截器实现的. struts-default.xml中定义了这些拦截器与Result类型. 所以,不继承struts-default包,Struts2提供的很多核心功 ...
- what's this? 浅谈js中this的指向问题
刚刚学习js的朋友可能和我一样,看到代码中的this总是一脸懵逼,不知道this到底指向谁.经过一段时间的了解,我想跟大家分享下自己的理解. 何时出现this 函数在调用的时候,会自动获得两个特殊变量 ...
- html5 canvas 画图表
(function () { var canvas = document.createElement("canvas"); canvas.width = 800; canvas.h ...
- BizTalk Server 2016
10月28日微软正式发布BizTalk第十个版本BizTalk Server 2016,陆续发布了Azure VM镜像.MSDN版本.开发者版本等.以下为BizTalk Server 2016 新特性 ...