雖然JAVA的程式都必須在JAVA的虛擬機器上執行,但是我們可以在這部機器中打一個洞,讓JAVA程式可以直接溝通實際的機器
JNI是一種讓JAVA程式可以外接外部程式的一種機制,讓JAVA程式更具有擴充性,下面將示範一個簡單的範例,這個範例中說明JAVA程式如何與C語言接軌,透過dll和native的方式來達成這項任務,經過這樣的測試與實驗之後讓我不得不佩服java這個程式語言
你不需要擔心程式方面的問題,因為底下的程式架構都相當簡單,主要只是讓我們體驗一下
工具介紹:我將使用visual c++ 6.0來製作dll,使用java sdk 1.4來編譯我的java
java部分的實作
程式碼如下(HelloWorld.java):
1234567891011
class HelloWorld {
public native void displayHelloWorld();←左方的native型態是通知Java這個函數會使用到外部函數
static {
System.loadLibrary("hello"); ←左方的程式碼代表我要載入hello.dll的動態連結,hello.dll的製作我在稍後會做介紹
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
當你完成上述的程式之後,將這個程式存檔為'HelloWorld.java'先用'javac HelloWorld.java'這個指令將它組譯成HelloWorld.class,然後使用'javah HelloWorld'產生HelloWorld.h,在HelloWorld.h中我們知道我們要實作一個函數Java_HelloWorld_displayHelloWorld(JNIEnv *, jobject); 接下來我將介紹如何完成這個函數
實作生平的第一個dll,在之前知道在windows和linux下有一種叫dll,動態連結的機制,但是一直不曉得到底它是怎麼做的,今天將要實作第一個這樣的東西
我會盡量將東西描述清楚,因為這是我第一次的經驗
首先啟動visual c++ 6.0,在檔案中選擇新增,然後在project中選擇Win32 Dynamic-Link Library這個選項,然後填寫你專案的名稱'hello',按下'Ok',請選擇An empty Dll project這一選項,然後按'Finish'再按下'Ok',我們要從頭開始。
經過上述動作之後我們就會得到一個空的專案資料,然後我們需要增加一些程式到我們的專案中,在這之前我們先處理好我們的.h檔,首先先到你安裝java JDK的目錄下找到include的資料夾,為了以後撰寫程式方便,將這個目錄下的所有檔案複製一份到你安裝visual c++ 6.0目錄下VC98\Include裡面,預設路徑為C:\Program Files\Microsoft Visual Studio\VC98\Include,將資料複製到此資料夾中,並將原本放在win32中的jawt_md.h和jni_md.h複製一份至C:\Program Files\Microsoft Visual Studio\VC98\Include
完成這些前置動作之後,再來將我們剛剛產生的HelloWorld.h加入我們的Header Files中,並新增一個.c的檔案HelloWorldImp.c,然後到上方的功能表中Build選則'Build hello.dll',然後你將會得到一個hello.dll在專案目錄下的Debug\hello.dll,到此為止,如果順利你應該的到dll檔
程式碼如下(HelloWorldImp.c):
12345678910
#include
#include "HelloWorld.h"
#include
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("HelloWorld");
return;
}
程式碼如下(HelloWorld.h)
123456789101112
/* DO NOT EDIT THIS FILE - it is machine generated */ #include
/* Header for class HelloWorld */ #ifndef _Included_HelloWorld #define _Included_HelloWorld
#ifdef __cplusplus extern "C" { #endif
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus } #endif
#endif
然後將hello.dll和HelloWorld.class放在同一個目錄下,執行java HelloWorld,出現列印HelloWorld在畫面上的結果
以上這是一個小小的範例,目的只是在做一個小小的實驗,因為沒有一個人會因為要列印一串自救去呼叫C語言來幫你做事,而會直接使用System.out.print("HelloWorld"),比較快一點
透過以上這個小實驗讓我們知道java和c之間是有辦法互通的,因此或許java可以透過這個方式與作業系統之間有更密切的互動
分享到:
相关推荐
Java调用动态链接库 Java 调用 DLL 源码
JAVA调用DLL JAVA调用DLLJAVA调用DLLJAVA调用DLLJAVA调用DLLJAVA调用DLL
是Java 调用DLL动态库框架,功能强大,告别往日的JNI,只需定义接口,就可以方便调用DLL库,为开发人员省了不少事。
java调用dll接口,备份供大家察看,谢谢大家共享。
java调用c++ dll代码
JAVA使用JNative包调用DLL文件
在Java中调用DLL(Dynamic Link Library)文件,可以使用Java的本地方法接口(JNI,Java Native Interface)来实现。JNI允许Java程序与本地代码进行交互,从而实现跨平台的功能。
Java调用dll示例,Java命名方法,C++实现生成DLL供JAVA调用
JAVA调用dll和ocx例子,操控学习JAVA调用DLL,ocx
Java调用DLL源代码JNA和JNative
java调用dll 文件的必备jar包和环境,java调用dll 文件的必备jar包和环境
这是java采用jni技术调用dll(动态链接库的一个demo),不需要任何改动,自己可以用,很适合初学者
This document is the API specification for the JNA library for simplified native library access for Java.
用java调用C或C++动态链接库原来如此简单 java调用dll
一个用于在java中调用dll动态代码库的开源组件,JNative-1.3.2
NetBetBeans 编写Java调用DLL代码
亲测可用,java 成功调用dll函数。包含调用回调函数,springboot版本。最近由于公司业务需要,要调用dll文件,用JNA调用。
JNA方式实现Java调用dll的必用jar包