`
503718696
  • 浏览: 19972 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

关于native关键字 java调用DLL

阅读更多

java native方法是指本地方法,当在方法中调用一些不是由java语言写的代码或者在方法中用java语言

直接操纵计算机硬件时要声明为native方法。


java中,通过JNI(Java Native Interface,java本地接口)来实现本地化。


Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。


  可以将native方法比作Java程序同C程序的接口,其实现步骤:


  1、在Java中声明native()方法,然后编译;


  2、用javah产生一个.h文件;(如果是包里的类的话,应采用 javah com.xxx.Object 类似这样的方法,否则会出错(UnsatisfiedLinkError)

)


  3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件);


  4、将第三步的.cpp文件编译成动态链接库文件;


  5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。


首先写好JAVA文件


 /*


  * Created on 2005-12-19 Author shaoqi


  */


 package com.hode.hodeframework.modelupdate;


 public class CheckFile


 {


     public native void displayHelloWorld();


     static


     {


  System.loadLibrary("test");


     }


     public static void main(String[] args)


{


        new CheckFile().displayHelloWorld();


     }


 }


然后根据写好的文件编译成CLASS文件


然后在classes或bin之类的class根目录下执行javah -jni com.hode.hodeframework.modelupdate.CheckFile,


 就会在根目录下得到一个com_hode_hodeframework_modelupdate_CheckFile.h的文件


然后根据头文件的内容编写com_hode_hodeframework_modelupdate_CheckFile.c文件



 #include "CheckFile.h" 

 #include  #include 

 JNIEXPORT void JNICALL Java_com_hode_hodeframework_modelupdate_CheckFile_displayHelloWorld(JNIEnv *env, jobject obj) {

     printf("Hello world!\n");

     return;

 }

之后编译生成DLL文件如“test.dll”,名称与System.loadLibrary("test")中的名称一致


 vc的编译方法:cl -I%java_home%\include -I%java_home%\include\win32 -LD com_hode_hodeframework_modelupdate_CheckFile.c -Fetest.dll


最后在运行时加参数-Djava.library.path=[dll存放的路径]


 


 


使用java与本地已编译的代码交互,通常会丧失平台可移植性。


如何使用JNI


步骤


在java程序中加入本地方法说明:public native void methodName(){};

产生本地方法的头文件:javah –jni ClassName

本地方法的实现与编译:在c中方法名为:Java_ ClassName _ methodName (JNIEnv *env, jobject obj,***)将头文件和(本地方法)实现文件编译成共享库文件

Java代码部分:


定义native方法----当程序中的方法实现是采用java以外的语言时,必须以native关键字说明;

加载共享库----System.loadLibrary(“libname”)方法可以实现共享库的加载,从而完成native方法在声明和实现之间的映射。(在类定义过程中,一般以static前缀来描述这一代码,从而隐式加载共享库,

例如:static { System.loadLibrary(“libname”; )};另外,libname和库文件名的对应关系是平台相关的,如在Solaris中为liblibname.so,而Windows系统中为libname.so )


为本地方法创建头文件:

语法----javah –jni class文件名;

目的----得出native方法的文件名,见(二。3),注意,比java中的native方法多两参数。

本地方法实现:

在c语言中,本地函数的写法如下:  JNIEXPORT void JNICALL Java_ ClassName _ methodName (JNIEnv *env, jobject obj,***){}

c语言代码应该包含下述头文件:jni.h及由javah生成的头文件。

 


JAVA调用DLL简单小例子


这个小例子用JNI调用了VC++做的DLL动态库。


1、总体说明:


实现一个函数,传入整形数i,返回值i*i,这个函数做在DLL中,java将通过JNI调用这个函数,传入一个参数,得到返回值。


确定DLL的名称为calldll.dll,函数shanfei(int i)。


2、编写java程序javacall.java,如下:


public class javacall


{


static


{


System.loadLibrary("calldll");


}


public native static int shanfei(int i);


public static void main(String[] args)


{


javacall jc = new javacall();


int j;


j = jc.shanfei(4);


System.out.println(j);


}


}


3、编译


javac javacall.java


4、生成头文件


javah javacall


生成javacall.h文件


5、制作VC++动态库


建立新DLL工程,程序中添加:


#include "javacall.h"


JNIEXPORT jint JNICALL Java_javacall_shanfei (JNIEnv *, jclass, jint p)


{


int j = p*p;


return j;



别忘了将javacall.h复制到VC工程目录中,然后编译,如果编译说找不到jni.h文件,可以将jni.h复制到工程目录中,还可将javacall.h文件中的#include <jni.h>改为#include "jni.h",再编译。


6、java调用


将生成的calldll.dll文件复制到javacall.java所在的目录中,运行


java javacall,应该可以看到运行结果。</jni.h>

0
2
分享到:
评论

相关推荐

    java调用dll接口

    3. `java调用dll.txt`:这个文本文件很可能包含了关于如何使用Java调用DLL的具体步骤、示例代码或者注意事项。 调用DLL的过程通常分为以下几个步骤: 1. **引入JNA库**:首先,在Java项目中添加`jna.jar`和`jna-...

    java调用DLL文件

    总结来说,Java调用DLL文件主要依赖于JNative库,通过定义Java接口、加载DLL、获取函数句柄、创建代理对象以及调用函数等步骤实现。这种方法使得Java开发者能够充分利用C/C++库的功能,同时也保持了Java的跨平台特性...

    java调用dll新

    总结,Java调用C++ DLL的过程主要包括:编写C++ DLL、创建Java JNI接口、生成JNI头文件、实现JNI接口并编译为DLL、最后在Java程序中加载和调用DLL。这个过程虽然有些复杂,但能充分利用现有C++库,拓展Java的功能。...

    java调用dll必备jar包

    Java调用DLL(动态链接库)是Java编程中的一项高级技术,主要应用于Java与本地代码交互,例如在Java中利用C++或C编写的库。本文将详细介绍如何使用Java调用DLL以及所需的必备jar包。 首先,Java并不直接支持DLL的...

    java的native关键字学习

    5. **本地到Java的调用**:除了Java调用本地代码,本地代码也可以调用Java的方法。通过`JNIEnv`指针,我们可以获取到Java对象和方法ID,进而调用Java代码。 6. **JNI数据类型映射**:JNI提供了Java数据类型和C数据...

    JAVA利用JNA调用DLL

    在Java编程环境中,有时我们需要与操作系统底层功能进行交互,例如调用C语言编写的动态链接库(DLL)函数。在这种情况下,Java Native ...JNA测试项目"JNATest"可能包含一个完整的示例,演示如何从Java调用DLL并运行。

    Java调用DLL例子

    本示例以"Java调用DLL例子"为主题,使用了JNative库作为接口来实现Java调用本地动态链接库。 JNative是一个开源的Java库,它提供了一种方法使得Java程序能够直接调用C/C++编写的函数,从而间接实现了调用DLL的功能...

    jni_java_dll_jsp.zip_Java调用dll_applet_java Applet_java dll jsp_j

    Java调用DLL文件是将Java程序与C/C++编写的动态链接库进行交互的技术,主要应用于需要利用非Java原生功能或与已有C/C++库集成的场景。本资料包"jni_java_dll_jsp.zip"提供了关于这个主题的详细资料,特别是针对...

    JNA方式实现Java调用dll的必用jar包

    标题"JNA方式实现Java调用dll的必用jar包"指的是使用JNA库来调用Windows平台上的动态链接库(.dll文件)所需的Java类库。这个"jna5.jar"文件是JNA的一个版本,其中包含了所有必要的组件,使得Java程序能够通过JNA...

    java调用dll

    ### Java调用DLL详解 在跨平台开发领域,Java凭借其强大的兼容性和广泛的适用性而备受青睐。然而,在某些特定场景下,如底层硬件访问、高性能计算或与已有C/C++库集成时,直接利用Java可能无法达到最优效果。这时,...

    Java调用dll文件开源组件jar包及说明文档

    Java调用DLL文件是软件开发中的常见需求,尤其是在Java与C/C++混合编程时。`JNative-1.3.2`是一个开源组件,专门设计用于帮助Java应用程序调用Windows平台上的DLL(动态链接库)文件,同时也支持Linux平台下的SO...

    非常好用java调用c++ dll文件demo

    - `Java调用C++ DLL的Java类`:这个类会声明`native`方法,并在运行时通过`System.loadLibrary`加载DLL。 - `JNI头文件`:由`javah`命令生成,定义了C++需要实现的函数原型。 - `C++源代码`:实现了JNI头文件中的...

    Java调用dll

    Java调用DLL是一种常见的跨语言交互技术,允许Java应用程序利用C++编译的动态链接库(DLL)中的功能。在本场景中,我们有一个Win7 64位系统,使用了1.6版本的JDK,并且用Visual Studio C++创建了一个64位的DLL。以下...

    java调用vc的dll

    在Java中,使用`System.loadLibrary`加载DLL,然后通过`Native Method Bindings`调用DLL中的函数。例如: ```java static { System.loadLibrary("myDll"); } public native void callMyFunction(int arg); ``...

    java连接调用dll动态库

    Java连接调用DLL动态库是将...总之,Java调用DLL动态库涉及到Java、C/C++和Windows平台的交互,需要对这些领域有一定的了解。通过JNI,我们可以利用Java的跨平台特性和DLL的高效执行能力,构建出强大的混合型应用程序。

    Java中调用动态库dll的方法 源代码

    另一种选择是使用第三方库,如JNA(Java Native Access),它允许Java直接调用DLL,无需编写C/C++代码,简化了过程。 总的来说,Java调用动态库DLL主要依赖于JNI或第三方库。虽然JNI提供了更底层的控制,但设置过程...

    JAVA JNI调用DLL完整步骤

    总结,Java调用DLL的完整步骤包括:定义Java的`native`方法,使用`javah`生成头文件,编写C/C++ DLL代码,编译DLL,最后在Java程序中调用。这个过程可能需要对JNI规范有深入理解,以及一定的C/C++编程基础。通过熟练...

    [测试通过]JAVA调用第三方DLL的简单方法:JNA及DEMO

    首先,我们来看标题中的关键点:“JAVA调用第三方DLL的简单方法”。在Java中,由于其跨平台的特性,原生与操作系统交互并不直接,而JNA提供了一种桥接机制,使得Java可以直接调用Windows、Linux等操作系统中的DLL...

    java调用dll实例

    Java调用DLL实例是将Java代码与C++动态链接库(DLL)进行交互的一个常见需求。JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互,包括C、C++等。这个实例是通过JNI来...

Global site tag (gtag.js) - Google Analytics