JNI使用方法
JNI可以让我们在java代码中调用本地库的功能。
下面记录一下JNI简单的使用方法
- 创建java端接口
public class JNIIterface {
// 导入最终生成的dll文件
static {
System.loadLibrary("JNIDemo");
}
// 声明dll文件中实现的接口
public native int MyMethod();
public native int add(int x, int y);
}
2. 生成接口对应的C的头文件
上面创建的JNIIterface类,JNIIterface .class文件的路径:\JNIDemo\bin\base\JNIIterface .class
在工程目录下的bin目录下执行命令:javah -classpath . -jni base.JNIIterface
然后会在\JNIDemo\bin\目录下生成base_JNIIterface.h文件
3. 使用visual studio编写接口的实现
创建C工程,具体步骤如下:
第一步:

第二步:

第三部:

导入需要的头文件
将上面第二步生成的头文件,以及jdk根目录下include目录下的jni.h和
include的win32目录下的jni_md.h文件拷贝到工程目录下(在创建的工程上面右键,然后点击倒数第二项就可以打开)

创建功能实现文件
在工程目录下源文件上右键,然后点击【追加】-》【新项目】,创建一个cpp文件
并编写如下代码:
#include "base_JNIIterface.h"
#include "jni.h"
#include <stdio.h> JNIEXPORT jint JNICALL Java_base_JNIIterface_MyMethod
(JNIEnv *, jobject){
printf("成功实现JNI测试DEMO");
return ;
} JNIEXPORT jint JNICALL Java_base_JNIIterface_add
(JNIEnv *, jobject, jint a, jint b){
return a + b;
}
4. 生成dll文件
在工程目录中的「解决方案」上右键,选择属性,然后如下图所示构成项目

然后编译工程后,会在工程目录下的Release目录下成成dll文件

5. 将dll文件配置到java工程
首先向dll文件放在java工程根目录下的lib目录下
然后按照如下步骤将dll文件作为Native Library添加进工程

编辑上图所示的Native Library Location,然后在弹出的界面选择Native Library所在的文件夹:

6. 编写测试类,检证JNI是否成功应用
public class HelloJNI {
public static void main(String[] args) {
JNIIterface hw = new JNIIterface();
int t = hw.add(3, 7);
int s = hw.MyMethod();
System.out.println(t);
System.out.println(s);
}
}
运行后的测试结果如下:
成功??JNI??DEMO
上面就是记录了使用JNI的最基本步骤。
对于如何使用已经写好的第三方dll文件的功能,比如系统的dll文件,还需要进行深入探索。
参考文章:http://www.runoob.com/w3cnote/jni-getting-started-tutorials.html
JNI使用方法的更多相关文章
- android — JNI注册方法说明
Jni中还可以采用RegisterNatives来注册jni的方法,注册以后的jni函数的命名可以不需要符合类似javah命令生成的函数的规则 RegisterNatives为JNIEnv的成员函数, ...
- Android调用JNI本地方法跟踪目标代码
正如Android调用JNI本地方法经过有点改变章所说跟踪代码是可行的,但是跟踪某些代码会出现anr,点击取消,还是不好运,有提高办法吗?回答是有(gdb还没试过,本文只讨论ida). 下面是我使用 ...
- Android JNI使用方法
经过几天的努力终于搞定了android JNI部分,下面将我的这个小程序和大家分享一下.android JNI是连接android Java部分和C/C++部分的纽带,完整使用JNI需要Java代码和 ...
- Android调用JNI本地方法经过有点改变
方法注册好后要经过哪些路 Android一个异常捕获项目 https://github.com/xroche/coffeecatch coffeecatch CoffeeCatch, a tiny n ...
- Android之——jni通用工具方法
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47002207 1.将java字符串转化为c++字符串 /** *工具方法 *将ja ...
- Android 4.4.2 动态加入JNI库方法记录 (一 JNI库层)
欢迎转载,务必注明出处.http://blog.csdn.net/wang_shuai_ww/article/details/44456755 本篇是继<s5p4418 Android 4.4. ...
- 实现apk 调用framework java JNI中方法
首先整个实现需要有Android源码编译环境.这里我用的是froyo2.2. 1.JNI层--C++代码部分 在目录frameworks/base/core/jni 下创建android_jnidem ...
- Android 4.4.2 动态加入JNI库方法记录 (二 app应用层)
欢迎转载,务必注明出处:http://blog.csdn.net/wang_shuai_ww/article/details/44458553 源代码下载地址:http://download.csdn ...
- Java Native Interface 五 JNI里的多线程与JNI方法的注册
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI里的多线程 在本地方法里写有关多线程的 ...
随机推荐
- Dev Label显示不同颜色字体
labelControl1.Text = "<size=14>Size = 14<br>" + "<b>Bold</b> ...
- centos 7 hadoop的安装和使用
准备工作 安装jdk 用户免密登录 安装参考文章: http://blog.csdn.net/circyo/article/details/46724335 http://www.linuxidc.c ...
- C++ STL基本容器的使用(vector、list、deque、map、stack、queue)
1.关联容器和顺序容器 C++中有两种类型的容器:顺序容器和关联容器,顺序容器主要有:vector.list.deque等.关联容器主要有map和set.如下图: 1.vector基本使用 #incl ...
- N元马尔科夫链的实现
马尔可夫模型(Markov Model)是一种统计模型,广泛应用在语音识别,词性自动标注,音字转换,概率文法等各个自然语言处理等应用领域.经过长期发展,尤其是在语音识别中的成功应用,使它成为一种通用的 ...
- Hadoop(三)搭建Hadoop全分布式集群
原文地址:http://www.cnblogs.com/zhangyinhua/p/7652686.html 阅读目录(Content) 一.搭建Hadoop全分布式集群前提 1.1.网络 1.2.安 ...
- jQuery ajax请求错误返回status 0和错误error的问题
上周发现一个jQuery ajax请求错误返回status 0和错误error的问题,responseText是"error",状态码是0而不是200: $.ajax({ type ...
- Error:Could not determine the class-path for interface com.android.builder.model.AndroidProject.
Android Studio导入Eclipse项目报错Error:Could not determine the class-path for interface com.android.builde ...
- vue父组件传参给子组件
其实组件之间传参有很多种方法: 1.通过本地存储 2.使用vuex状态管理 今天记录一下第三种方法 1.首页我们先创建一个项目(创建项目自行百度) 2.打开项目,在components文件夹下新建一个 ...
- vue传参页面刷新数据丢失问题
在做vue的时候,经常会遇到组件之间数据的传递问题,通过params或者query传参,但是,当页面刷新的时候,数据会丢失,找不到数据.今天经过总结,解决了这个问题.通过了一下几种情况进行传值: 通过 ...
- do {...} while (0) 的用途汇总(欢迎补充)
在一些Linux内核和其它的开源代码中,我们经常看到像下面这样的代码: do{ ... }while(0) 该代码片段并非循环,这样想想似乎使用do…while没有任何意义,那么为什么还要使用它呢? ...