当前位置:  编程技术>java/j2ee

JAVA中JNI的简单使用分享

    来源: 互联网  发布时间:2014-10-28

    本文导语:  了解JNI:JAVA因其跨平台特性而受人们喜爱,也正因此,使得它和本机各种内部联系变得很少,所以JNI(Java Native Interface)就是用来解决JAVA本地操作的一种方式。JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(在WI...

了解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   
/* 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 jdk中的LinkedHashMap实现简单的LRU算法
  • MySocketServer.java 使用或覆盖一个不鼓励使用的API???
  • java将类序列化并存储到mysql(使用hibernate)
  • JAVA中不赞成使用(Deprecated)的方法是否可以使用
  • 各位使用过JAVA的朋友们!JAVA好用吗?它有向VC那样的集成开发环境吗?
  • 如何使用linux下的java编译器???? iis7站长之家
  • 哪位知道如何用JAVA进行图形文件的缩放? 是使用JAVA2D 或是有第三方的软件?
  • java堆栈类使用实例(java中stack的使用方法)
  • env查看环境变量,JAVA_HOME明明在里面,但使用nutch时还是提示JAVA_HOME not set?
  • 如何使用linux下的java编译器????
  • 如何使用java这个命令?
  • 为什么使用cat输出的文本文件是中文的,使用java从文件读取出来时显示的是乱码?
  • linux 远程上使用java
  • UNIX下使用java运行class的问题
  • java:sun公司的联机帮助如何使用?
  • 请教如何使用Java编写的Applet程序关闭浏览器??
  • 怎么使用 JAVA 的包呀???
  • 针对使用java进行硬件编程
  • 使用editplus编写java如何编译成字节码文件,如何解释
  • 谁能告诉我哪里能找到java包内部类及方法使用介绍
  • 使用java时间的调查,谢谢大家
  • Java代码分享工具 Java Gems
  • 输出java进程的jstack信息示例分享 通过线程堆栈信息分析java线程
  • java去除集合中重复元素示例分享 java去除重复
  • java读取csv文件示例分享(java解析csv文件)
  • java求三个数的最大值的示例分享
  • java把字符串写入文件里的简单方法分享
  • java向文件末尾添加内容示例分享
  • 升级了!分享Java资料
  • java中Scanner类的简单用法分享
  • java删除文件夹下所有文件示例分享
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 高手指点:不用JNI,如何在Java进程中新起一个JVM并在其中启动另一个Java进程。
  • 请问如何用jni类来调用一个非java写的外部exe?谢谢!
  • jni的方法,用java调用c的代码,遇到的问题!
  • 100分求java +VC6.0使用JNI的最简单例子
  • 我在Thinking in Java中遇到的Jni问题!
  • jni中汉字问题,如何把java中的汉字转化到c中去?
  • linux下JNI给JAVA传递中文的问题
  • 有没有人做过JNI,我要在C++中调用java类方法,那个javai.dll在那里啊?(重分向谢!)
  • Java使用JNI方法调用DLL问题
  • JNI:如何在C++中调用Java Method?
  • 关于Java本地接口的问题(JNI),分数不是问题
  • 用个java的jni的和java高手们帮我看个问题:急急!!!!!!!!!!!!
  • c++ mk文件出错Jni调用产生java.lang.UnsatisfiedLinkError错误解决方法
  • 如何在java中获取dll中的字符串或者字符数组(通过jni)?
  • 安卓应用开发通过java调用c++ jni的图文使用方法
  • java jni调用c函数实例分享(java调用c函数)
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍
  • 我对JAVA一窍不通,可惜别人却给我一个Java的project,要我做一个安装程序,请问哪里有JAVA INSTALLER下载,而且我要不要安装java的sdk才能完成此项任务?
  • java命名空间java.security类keystore的类成员方法: getdefaulttype定义及介绍
  • 新年第一天,让我们讨论一下未来一年JAVA的发展趋势! 个人认为,JAVA将主要朝ERP和JAVA手机方面发展!
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getclasspath定义及介绍


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3