了解JNI:JAVA因其跨平台特性而受人们喜爱,也正因此,使得它和本机各种内部联系变得很少,所以JNI(Java Native Interface)就是用来解决JAVA本地操作的一种方式。JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。

步骤如下:

1、写好.java源文件:

package com.home;

public class Testdll {
// 声明所调用的库名称
static {
System.loadLibrary("hello");
} // 对将要调用的方法做本地声明,native关键字不可少
public native static int get(); public native static void set(int i); public static void main(String[] args) {
Testdll test = new Testdll();
test.set(5);
System.out.println(test.get());
}
}

2、用javac testdll.java编译它,会生成testdll.class。

3、然后用javah 命令生成testdll.h文件,这个文件需要被C/c++程序调用来生成所需的库文件。

注意操作:首先进入src目录下,然后执行 javah -classpath . -jni com.home.Testdll

4、对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了。

这是刚刚生成的.h头文件(com_home_Testdll.h)

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_home_Testdll */ #ifndef _Included_com_home_Testdll
#define _Included_com_home_Testdll
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_home_Testdll
* Method: get
* Signature: ()I
*/
JNIEXPORT jint JNICALL Java_com_home_Testdll_get
(JNIEnv *, jclass); /*
* Class: com_home_Testdll
* Method: set
* Signature: (I)V
*/
JNIEXPORT void JNICALL Java_com_home_Testdll_set
(JNIEnv *, jclass, jint); #ifdef __cplusplus
}
#endif
#endif

具体实现时,我们只关心这两个函数原型
JNIEXPORT jint JNICALL Java_com_home_Testdll_get (JNIEnv *, jclass);

JNIEXPORT void JNICALL Java_com_home_Testdll_set (JNIEnv *, jclass, jint);

这里JNIEXPORT和JNICALL都是JNI的关键字,表示此函数是要被JNI调用的。而jint是以JNI为中介使JAVA的int类型与本地的int沟通的一种类型,我们可以视而不见,就当做int使用。函数的名称是JAVA_再加上java程序的package路径再加函数名组成的。参数中,我们也只需要关心在JAVA程序中存在的参数,至于JNIEnv*和jclass我们一般没有必要去碰它。

5、我们用testdll.cpp文件具体实现这两个函数:

 #include "com_home_Testdll.h"
  
  int i = 0;
  
  JNIEXPORT jint JNICALL Java_com_home_Testdll_get (JNIEnv *, jclass)
  
  {
  
  return i;
  
  }
  
  JNIEXPORT void JNICALL Java_com_home_Testdll_set (JNIEnv *, jclass, jint)
  
  {
  
  i = j;
  
  }

6、编译连接成DLL库文件。并且名称为hello(要与JAVA中需要调用的一致)。

操作可以使用VS的cl命令

7、把hello.dll拷贝到Testdll.class的目录下,然后 java Testdll运行它,就OK了。

JAVA中JNI的简单使用的更多相关文章

  1. 多线程(三) java中线程的简单使用

    java中,启动线程通常是通过Thread或其子类通过调用start()方法启动. 常见使用线程有两种:实现Runnable接口和继承Thread.而继承Thread亦或使用TimerTask其底层依 ...

  2. Java中JNI的使用详解第二篇:JNIEnv类型和jobject类型的解释

    上一篇说的是一个简单的应用,说明JNI是怎么工作的,这一篇主要来说一下,那个本地方法sayHello的参数的说明,以及其中方法的使用 首先来看一下C++中的sayHello方法的实现: JNIEXPO ...

  3. Java中JNI的使用详解第一篇:HelloWorld

    转自: http://blog.csdn.net/jiangwei0910410003/article/details/17465085 今天开始研究JNI技术,首先还是老套路,输出一个HelloWo ...

  4. Java中JNI的使用详解第四篇:C/C++中创建Java对象和String字符串对象及对字符串的操作方法

    首先来看一下C/C++中怎么创建Java对象:在JNIEnv中有两种方法是用来创建Java对象的: 第一种方法: jobject  NewObject(jclass clazz  , jmethodI ...

  5. java中数据流的简单介绍

    java中的I/O操作主要是基于数据流进行操作的,数据流表示了字符或者字节的流动序列. java.io是数据流操作的主要软件包 java.nio是对块传输进行的支持 数据流基本概念 “流是磁盘或其它外 ...

  6. java中volatile的简单理解

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7833881.html 据说,volatile是java语言中最轻量级的并发控制方式. vo ...

  7. 关于JAVA中异常处理的简单阐释.

    ---恢复内容开始--- 这是我的一篇要在博客园发布的随笔,主要是简单的概括一下我本次所学的关于异常处理的知识.有讲的不妥当的地方,或者有需要补充的,还请各位高人给指点,共同学习,虚心求学.谢谢啦~ ...

  8. Java中JNI的使用详解第三篇:JNIEnv类型中方法的使用

    转自: http://blog.csdn.net/jiangwei0910410003/article/details/17466369 上一篇说道JNIEnv中的方法的用法,这一篇我们就来通过例子来 ...

  9. Java中JNI的使用详解第六篇:C/C++中的引用类型和Id的缓存

    首先来看一下C/C++中的引用 从Java虚拟机创建的对象传到本地C/C++代码时会产生引用,根据Java的垃圾回收机制,只要有引用存在就不会触发该引用指向的Java对象的垃圾回收 第一.局部引用: ...

随机推荐

  1. Android-adb相关

    最近做android开发遇到无法通过usb链接设备的情况,通过wifi连接设备调试也颇为方便 1.android 要root , 下载终端app  比如 BetterTerminal 2.通过以下命令 ...

  2. ios 改变状态栏颜色

    http://stackoverflow.com/questions/17678881/how-to-change-status-bar-text-color-in-ios-7 stackoverfl ...

  3. SVN的使用(转发)

    http://my.oschina.net/joanfen/blog/194491?fromerr=LM5QY3YF

  4. AMD和CMD的区别

    1.cmd define(function(require,export){ var b = 1; var a = require('./a'); a.dosomething(); }); 2.amd ...

  5. statistic学习笔记

    1. 假设检验:就是对于符合一定前提条件的数据,先作一个假设H0,还有一个备择假设H1(一般是H0的反面,或者是H0不包含的情况),通过一定的计算公式,算出一个值(比如开方检验就是开方值),这个值的理 ...

  6. android 05

    控件:RadioButton CheckedBox RatingBar ProgressBar 下拉列表:ListView Spinner <!-- 单选按钮必须放在单选按钮组当中才能生效 ,并 ...

  7. Reverse Interger

    Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 Have you ...

  8. JVM内存管理及垃圾回收

    一.JVM内存的构 Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法.总体分为下面几个部分: 程序计数器(Progra ...

  9. sql编程 1

    declare emp_count number;begin select count(*) into emp_count from emp where HIOREDATE >= TO_DATE ...

  10. window.location.href问题,点击,跳转到首页

    onClick="window.location.href='./';" 点击,跳转到首页. location.href=url Js中实现跳转 window.location.h ...