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入门的更多相关文章

  1. 三、Android NDK编程预备之Java jni入门创建C/C++共享库

    转自: http://www.eoeandroid.com/thread-264971-1-1.html 应网友回复,答应在两天前要出一篇创建C/C++共享库的,但由于清明节假期,跟朋友出去游玩,丢手 ...

  2. 二、Android NDK编程预备之Java jni入门Hello World

    转自:  http://www.eoeandroid.com/forum.php?mod=viewthread&tid=264543&fromuid=588695 昨天已经简要介绍了J ...

  3. Android NDK JNI 入门笔记-day04-NDK实现Hash算法

    * Android NDK JNI 入门笔记目录 * 开头 前面的学习,我们已经掌握了 NDK 开发的必备知识. 下一步就要多实践,通过创造问题并解决问题,来增加熟练度,提升经验. 日常开发中,经常会 ...

  4. jni 入门 android的C编程之旅 --->环境搭建&&helloworld

    需要进行jni的开发有一下几个条件: 1:能初步使用C/C++如果不会,请参读 谭浩强的  C编程语言 2:android应用开发已经基本入门,如果没有,请先行学习 这两个条件基本满足后,我们开始了: ...

  5. JNI 入门

    1.http://cherishlc.iteye.com/blog/1756762 Android 学习笔记--利用JNI技术在Android中调用.调试C++代码 2.http://my.eoe.c ...

  6. 使用as开发jni入门(附验证):配置ndk开发环境,配置as相关jni配置

    编写jni,生成so文件: 1.通过as内置的Android SDK下载需要使用的ndk,在系统环境变量设置相关参数 2.新建一个普通as项目,新建一个类,用来静态加载so库和书写本地native方法 ...

  7. andorid jni入门教程一之helloworld

    开发环境:windows2007, eclipse 做anroid越深发现用到底层开发的时候越多,但是我以前也没有搞过,因此现在打算好好学习学习.先从最简单的做起.正所谓万事开头难啊. 搞了近一天终于 ...

  8. Android之jni入门

    jni即java native interface,使用jni我们可以在JAVA中调用C代码,提高了效率,可以复用代码,可以灵活的应用于各种场景 怎么使用JNI 安装软件 1.NDK 用于将C代码编译 ...

  9. 【转】 Android 开发 之 JNI入门 - NDK从入门到精通

    原文网址:http://blog.csdn.net/shulianghan/article/details/18964835 NDK项目源码地址 : -- 第一个JNI示例程序下载 : GitHub  ...

随机推荐

  1. 在Xcode中显示代码行号

    打开一个程序,点击屏幕菜单栏的Xcode,然后选Xcode -> Preferences -> Text Editing -> Show line numbers前面打勾就行了. 如 ...

  2. Android - 错误:"No resource found that matches the given name android:Theme.Material"

    Android - 错误:"No resource found that matches the given name android:Theme.Material" 本文地址:  ...

  3. OpenCV学习(17) 细化算法(5)

    本章我们看下Pavlidis细化算法,参考资料http://www.imageprocessingplace.com/downloads_V3/root_downloads/tutorials/con ...

  4. Python爬虫——使用 lxml 解析器爬取汽车之家二手车信息

    本次爬虫的目标是汽车之家的二手车销售信息,范围是全国,不过很可惜,汽车之家只显示100页信息,每页48条,也就是说最多只能够爬取4800条信息. 由于这次爬虫的主要目的是使用lxml解析器,所以在信息 ...

  5. 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的时候也会 ...

  6. nodejs自动热加载文件的做法

    https://stackoverflow.com/questions/1972242/how-to-auto-reload-files-in-node-js -------------------- ...

  7. Java Object Clone

    Java Object Clone User user = new User(); user.setName("tom"); User user1 = new User(); us ...

  8. linux下设置 git ssh 代理

    /root/.ssh (以下为 root权限的操作) 1. 生成key. $ ssh-keygen 一路回车,直到生成 id_rsa, id_rsa.pub 1.1 chmod 400 id_rsa. ...

  9. kindle 电子书去除DRM

    DRM,Digital Rights Management,数字版权管理. amazon购买的图书会下发到你的kindle设备.电子书格式通常为.azw3.里面包括了DRM,仅仅能在你的设备上使用. ...

  10. 实战:INNOBACKUPEX for mysql 5.6自己主动还原脚本-v2

    脚本再次更新,共享一下! #!/bin/sh # # 用法: # ./restore.sh /你备份文件的全路径 #ocpyang@126.com INNOBACKUPEX=innobackupex ...