JNI可以让我们在java代码中调用本地库的功能。

下面记录一下JNI简单的使用方法

  1. 创建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使用方法的更多相关文章

  1. android — JNI注册方法说明

    Jni中还可以采用RegisterNatives来注册jni的方法,注册以后的jni函数的命名可以不需要符合类似javah命令生成的函数的规则 RegisterNatives为JNIEnv的成员函数, ...

  2. Android调用JNI本地方法跟踪目标代码

    正如Android调用JNI本地方法经过有点改变章所说跟踪代码是可行的,但是跟踪某些代码会出现anr,点击取消,还是不好运,有提高办法吗?回答是有(gdb还没试过,本文只讨论ida). 下面是我使用  ...

  3. Android JNI使用方法

    经过几天的努力终于搞定了android JNI部分,下面将我的这个小程序和大家分享一下.android JNI是连接android Java部分和C/C++部分的纽带,完整使用JNI需要Java代码和 ...

  4. Android调用JNI本地方法经过有点改变

    方法注册好后要经过哪些路 Android一个异常捕获项目 https://github.com/xroche/coffeecatch coffeecatch CoffeeCatch, a tiny n ...

  5. Android之——jni通用工具方法

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47002207 1.将java字符串转化为c++字符串 /** *工具方法 *将ja ...

  6. Android 4.4.2 动态加入JNI库方法记录 (一 JNI库层)

    欢迎转载,务必注明出处.http://blog.csdn.net/wang_shuai_ww/article/details/44456755 本篇是继<s5p4418 Android 4.4. ...

  7. 实现apk 调用framework java JNI中方法

    首先整个实现需要有Android源码编译环境.这里我用的是froyo2.2. 1.JNI层--C++代码部分 在目录frameworks/base/core/jni 下创建android_jnidem ...

  8. Android 4.4.2 动态加入JNI库方法记录 (二 app应用层)

    欢迎转载,务必注明出处:http://blog.csdn.net/wang_shuai_ww/article/details/44458553 源代码下载地址:http://download.csdn ...

  9. Java Native Interface 五 JNI里的多线程与JNI方法的注册

    本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI里的多线程 在本地方法里写有关多线程的 ...

随机推荐

  1. HTTP响应状态码 含义

    100 客户端可以继续 101 指示服务器正根据 Upgrade 头切换协议 200 请求正常成功 201 指示请求成功并在服务器上创建了一个新资源 202 指示已接受请求进行处理但处理尚未完成 20 ...

  2. 通过超链接启动App

    问题:微信里分享一个链接给你,你点击这个链接,一.如果你安装了这个钱包,那就直接打开钱包.二.如果没有安装钱包就跳转到下载钱包的地方 要点:首先要让浏览器知道 app 是谁,然后再让浏览器调用app ...

  3. shell 数组使用简介

    数组简介 bash 只提供一维数组,并且没有限定数组的大小.类似与C语言,数组元素的下标由0开始编号.获取数组中的元素要利用下标.下标可以是整数或算术表达式,其值应大于或等于 0.用户可以使用赋值语句 ...

  4. Azure Redis 缓存使用注意事项与排查问题文档整理

    StackExchange.Redis 使用名为 synctimeout 的配置设置进行同步操作,该设置的默认值为 1000 毫秒. 如果同步调用未在规定时间内完成,StackExchange.Red ...

  5. ThreadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别

    Java并发编程中在使用到ThreadPoolExecutor时,对它的三个关闭方法(shutdown().shutdownNow().awaitTermination())的异同点如下: shutd ...

  6. mysql通信协议的半双工机制理解

    一.通信知识中的半双工概念 通信的方式分为:单工通信,半双工,全双工. 全双工的典型例子是:打电话.电话在接到声音的同时也会传递声音.在一个时刻,线路上允许两个方向上的数据传输.网卡也是双工模式.在接 ...

  7. Ansible-安装-秘钥-部署-使用

    本文转自:https://www.cnblogs.com/ylqh/p/5902259.html ansiblemaster:192.168.74.146 ansibleslave1 :192.168 ...

  8. 【详解】JNI(Java Native Interface)(一)

    前言: 一提到JNI,多数编程者会下意识地感受到一种无法言喻的恐惧.它给人的第一感觉就是"难",因为它不是单纯地在JVM环境内操作Java代码,而是跳出虚拟机与其他编程语言进行交互 ...

  9. 超详细的Java时间工具类

    package com.td.util; import java.sql.Timestamp; import java.text.ParseException; import java.text.Pa ...

  10. Spring事务传播属性介绍(一).required 和 reuqires_new

    Mandatory.Never.Not_Support传播属性分析传送门:https://www.cnblogs.com/lvbinbin2yujie/p/10260030.html Nested传播 ...