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 ...
随机推荐
- 在Xcode中显示代码行号
打开一个程序,点击屏幕菜单栏的Xcode,然后选Xcode -> Preferences -> Text Editing -> Show line numbers前面打勾就行了. 如 ...
- Android - 错误:"No resource found that matches the given name android:Theme.Material"
Android - 错误:"No resource found that matches the given name android:Theme.Material" 本文地址: ...
- OpenCV学习(17) 细化算法(5)
本章我们看下Pavlidis细化算法,参考资料http://www.imageprocessingplace.com/downloads_V3/root_downloads/tutorials/con ...
- Python爬虫——使用 lxml 解析器爬取汽车之家二手车信息
本次爬虫的目标是汽车之家的二手车销售信息,范围是全国,不过很可惜,汽车之家只显示100页信息,每页48条,也就是说最多只能够爬取4800条信息. 由于这次爬虫的主要目的是使用lxml解析器,所以在信息 ...
- Android -- uses-sdk:minSdkVersion 10 cannot be smaller than version L declared in library com.android.support:appcompat-v7:21.0.0-rc1
这是一个报错,是我在Android Studio上添加完Support-v4和v7包之后爆出的错误,百度了好久也没有百度到.当时我的项目有minSdkVersion 19. 设置版本最小为L的时候也会 ...
- nodejs自动热加载文件的做法
https://stackoverflow.com/questions/1972242/how-to-auto-reload-files-in-node-js -------------------- ...
- Java Object Clone
Java Object Clone User user = new User(); user.setName("tom"); User user1 = new User(); us ...
- linux下设置 git ssh 代理
/root/.ssh (以下为 root权限的操作) 1. 生成key. $ ssh-keygen 一路回车,直到生成 id_rsa, id_rsa.pub 1.1 chmod 400 id_rsa. ...
- kindle 电子书去除DRM
DRM,Digital Rights Management,数字版权管理. amazon购买的图书会下发到你的kindle设备.电子书格式通常为.azw3.里面包括了DRM,仅仅能在你的设备上使用. ...
- 实战:INNOBACKUPEX for mysql 5.6自己主动还原脚本-v2
脚本再次更新,共享一下! #!/bin/sh # # 用法: # ./restore.sh /你备份文件的全路径 #ocpyang@126.com INNOBACKUPEX=innobackupex ...