JNI入门
JNI是Java Native Interface的缩写,Native指C/C++。
JNI内容涉及两个方面:
- Java调用C,这种情况是最主要的
- C调用Java,这种情况不常见
第一步:编写Java代码
package haha;
public class Haha {
public native int add(int x, int y);
public native int sub(int x, int y);
public static void main(String[] args) {
System.loadLibrary("haha");
Haha haha = new Haha();
int x = haha.add(3, 6);
System.out.println(x);
x = haha.sub(3, 6);
System.out.println(x);
}
}
定义一个类Haha,它包括两个方法:add和sub,分别是加法和减法。使用Native关键字表明这两个方法是本地方法,无需在Java中给出实现。
注意:加载dll时,不需要带.dll后缀
第二步:javah命令生成头文件
本项目目录结构如下:src/haha/Haha.java,控制台进入到src/目录下,使用javah命令分析haha.Haha.java文件,生成头文件。
javah haha.Haha
注意:
- javah是jdk安装之后自带的命令,使用之前请确保jdk/bin在环境变量Path中。
- javah haha.Haha,不需要后缀名.java
第三步:编写C代码
打开VisualStudio,新建win32项目,选择dll作为项目类型。

默认分成头文件、源文件、资源文件三个文件夹,没有必要,把这三个文件夹删掉。

新建haha_Haha.h头文件,把第二步中生成的头文件内容复制进来。
右键项目属性,在VC++/包含目录中,添加JDK/include和JDK/include/win32这两个文件夹(用分号隔开),不要删除原来已经有的目录。

新建“源.cpp”,include 那个头文件,并给出实现:
#include"haha_Haha.h"
JNIEXPORT jint JNICALL Java_haha_Haha_add
(JNIEnv *env, jobject obj, jint x, jint y){
return x + y;
}
JNIEXPORT jint JNICALL Java_haha_Haha_sub
(JNIEnv *env, jobject obj, jint x, jint y){
return x - y;
}
最后,点击菜单“生成/生成解决方案(快捷键F7)”或者“生成/重新生成解决方案”,就会在debug目录下找到dll了。

复制上面的dll路径,准备去IntelliJ里面试试能不能加载这个dll
第四步:添加dll运行Java代码
直接运行Java代码会报错:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no haha in java.library.path
看来,必须让java知道dll在哪里,这可以通过java.library.path属性来实现。
点击菜单“Run/Edit Configuration”添加java运行参数

这时运行CTRL+SHIFT+F10运行代码,报错了:
Can't load IA 32-bit .dll on a AMD 64-bit platform
看来,生成的dll是32位的,而我的JDK是64位的(我的系统是64位的)。
切换到VS中,更改项目属性/配置属性,选择64位平台(如果没有x64,点击配置管理器新建平台即可)。之后重新生成dll。
会发现此时dll的目录也发生了改变,所以需要更改java.library.path参数(这个参数跟jar包的classpath是两回事)。
再次运行,终于成功了。
最后
本文只是JNI的入门小例子,更多内容参考《Java核心技术 卷二:高级特性》最后一章。
JNI包括:
- Java和C中数据类型的对应关系,尤其是String类型,C只支持ASCII码,而Java中的String是Unicode范围。
- C中代码访问Java静态成员的变量和方法
- C中代码访问Java对象的成员变量和方法
- C中变量资源申请和释放
- C中代码访问Java数组
JNI入门的更多相关文章
- 三、Android NDK编程预备之Java jni入门创建C/C++共享库
转自: http://www.eoeandroid.com/thread-264971-1-1.html 应网友回复,答应在两天前要出一篇创建C/C++共享库的,但由于清明节假期,跟朋友出去游玩,丢手 ...
- 二、Android NDK编程预备之Java jni入门Hello World
转自: http://www.eoeandroid.com/forum.php?mod=viewthread&tid=264543&fromuid=588695 昨天已经简要介绍了J ...
- Android NDK JNI 入门笔记-day04-NDK实现Hash算法
* Android NDK JNI 入门笔记目录 * 开头 前面的学习,我们已经掌握了 NDK 开发的必备知识. 下一步就要多实践,通过创造问题并解决问题,来增加熟练度,提升经验. 日常开发中,经常会 ...
- jni 入门 android的C编程之旅 --->环境搭建&&helloworld
需要进行jni的开发有一下几个条件: 1:能初步使用C/C++如果不会,请参读 谭浩强的 C编程语言 2:android应用开发已经基本入门,如果没有,请先行学习 这两个条件基本满足后,我们开始了: ...
- JNI 入门
1.http://cherishlc.iteye.com/blog/1756762 Android 学习笔记--利用JNI技术在Android中调用.调试C++代码 2.http://my.eoe.c ...
- 使用as开发jni入门(附验证):配置ndk开发环境,配置as相关jni配置
编写jni,生成so文件: 1.通过as内置的Android SDK下载需要使用的ndk,在系统环境变量设置相关参数 2.新建一个普通as项目,新建一个类,用来静态加载so库和书写本地native方法 ...
- andorid jni入门教程一之helloworld
开发环境:windows2007, eclipse 做anroid越深发现用到底层开发的时候越多,但是我以前也没有搞过,因此现在打算好好学习学习.先从最简单的做起.正所谓万事开头难啊. 搞了近一天终于 ...
- Android之jni入门
jni即java native interface,使用jni我们可以在JAVA中调用C代码,提高了效率,可以复用代码,可以灵活的应用于各种场景 怎么使用JNI 安装软件 1.NDK 用于将C代码编译 ...
- 【转】 Android 开发 之 JNI入门 - NDK从入门到精通
原文网址:http://blog.csdn.net/shulianghan/article/details/18964835 NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub ...
随机推荐
- fisher精确检验(fisher’s exat test)和超几何分布
- wtforms的简单示例
1.先定义一个类: #!/usr/bin/env python # -*- coding: utf-8 -*- # Created by xxx on 2017/3/13 from wtforms i ...
- 第八章 JVM性能监控与故障处理工具(2)
注意:该篇博客主要记录自<深入理解java虚拟机(第二版)> 说明:关于命令行的JVM性能监控与故障处理工具见<第七章 JVM性能监控与故障处理工具(1)> 1.图像化的故障处 ...
- Cesium随笔(3)随鼠标实时显示经纬度坐标以及高度【转】
在网页三维地球上进行可视化开发与经纬度坐标以及高度是分不开的,能够实时获取鼠标位置的经纬度对可视化效果有很好的帮助,Cesium当然能做到: (1)首先在里创建显示坐标的容器 样式自己调整的合适即可 ...
- 简单JavaScript语句实现搜索关键字高亮功能
高亮功能主要是指对页面中指定区域的指定文字进行高亮显示,也就是背景着色.一般在搜索结果页面会经常用到这个功能. 下面就为大家提供一种解决方案,用javascript实现. 首先在<head> ...
- ajax局部刷新一个div下的jsp
用AJAX刷新一个DIV中的jsp内容 <script type="text/javascript"> var xmlhttp; function startrefre ...
- .NET MVC自定义错误处理页面的方法
在ASP.NET MVC中,我们可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了HandleErrorAttribute特性,那 ...
- [Javascript] Wrap an API with a Proxy
Proxies allow you to use functions that haven't yet been defined on an object. This means that you c ...
- java编程思想---对象
一.对象 对于每种语言来说,都有自己操纵内存中元素的方法. 在java中,一切被视为对象.可是操纵对象的是一个"引用".举个样例,能够比作为遥控器对电视的操作,遥控器就是引用,而电 ...
- poj 2391 (Floyd+最大流+二分)
题意:有n块草地,一些奶牛在草地上吃草,草地间有m条路,一些草地上有避雨点,每个避雨点能容纳的奶牛是有限的,给出通过每条路的时间,问最少需要多少时间能让所有奶牛进入一个避雨点. 两个避雨点间可以相互到 ...