jni編譯dll
『壹』 java中怎麼調用vb編寫的dll文件啊,網上找了很多例子了,都不行。希望可以有詳細的代碼,謝謝大家了。
用JNI(Java Native Interface),它允許Java代碼和其他語言寫的代碼進行交互。JNI一開始是為了本地已編譯語言,尤其是C和C++而設計的,但是它並不妨礙你使用其他語言,只要調用約定受支持就可以了。
使用步驟:
·使用javac命令編譯所編寫的java類·編寫帶有native聲明的方法的java類
JNI
,然後使用javah + java類名生成擴展名為h的頭文件
·使用C/C++實現本地方法
·將C/C++編寫的文件生成動態連接庫
·ok
1) 編寫java程序:這里以HelloWorld為例。
代碼1:
public class HelloWorld {
public native void displayHelloWorld();//所有native關鍵詞修飾的都是對本地的聲明
static {
System.loadLibrary("hello");//載入本地庫
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
聲明native方法:如果你想將一個方法做為一個本地方法的話,那麼你就必須聲明該方法為native的,並且不能實現。其中方法的參數和返回值在後面講述。 Load動態庫:System.loadLibrary("hello");載入動態庫(我們可以這樣理解:我們的方法 displayHelloWorld()沒有實現,但是我們在下面就直接使用了,所以必須在使用之前對它進行初始化)這里一般是以static塊進行載入的。同時需要注意的是System.loadLibrary();的參數「hello」是動態庫的名字。
2) 編譯
沒有什麼好說的了javac HelloWorld.java
3) 生成擴展名為h的頭文件javah HelloWorld
jni HelloWorld 頭文件的內容:
/*DO NOT EDI TTHIS FILE - it is mach inegenerated*/
#include<jni.h>
/*Header for class HelloWorld*/
#ifndef_Included_HelloWorld
#define_Included_HelloWorld
#ifdef__cplusplus
extern"C"{
#endif
/*
*Class:HelloWorld
*Method:displayHelloWorld
*Signature:()V
*/
JNIEXPORTvoidJNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv*,jobject);
#ifdef__cplusplus
}
#endif
#endif
JNI
(這里我們可以這樣理解:這個h文件相當於我們在java裡面的介面,這里聲明了一個Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法,然後在我們的本地方法裡面實現這個方法,也就是說我們在編寫C/C++程序的時候所使用的方法名必須和這里的一致)。
4) 編寫本地方法實現和由javah命令生成的頭文件裡面聲明的方法名相同的方法。
代碼2:
#include"jni.h"
#include"HelloWorld.h"
JNI3//#includeotherheaders
JNIEXPORTvoidJNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv*env,jobjectobj)
{
printf("Helloworld!\n");
return;
}
JNI
注意代碼2中的第1行,需要將jni.h(該文件可以在%JAVA_HOME%/include文件夾下面找到)文件引入,因為在程序中的JNIEnv、 jobject等類型都是在該頭文件中定義的;另外在第2行需要將HelloWorld.h頭文件引入(我是這么理解的:相當於我們在編寫java程序的時候,實現一個介面的話需要聲明才可以,這里就是將HelloWorld.h頭文件裡面聲明的方法加以實現。當然不一定是這樣)。然後保存為 HelloWorldImpl.c就ok了。
5) 生成動態庫
這里以在Windows中為例,需要生成dll文件。在保存HelloWorldImpl.c文件夾下面,使用VC的編譯器cl成。 cl -I%java_home%\include -I%java_home%\include\win32 -LD HelloWorldImp.c -Fehello.dll 注意:生成的dll文件名在選項-Fe後面配置,這里是hello,因為在HelloWorld.java文件中我們loadLibary的時候使用的名字是hello。當然這里修改之後那裡也需要修改。另外需要將-I%java_home%\include -I%java_home%\include\win32參數加上,因為在第四步裡面編寫本地方法的時候引入了jni.h文件。
如果配置了MinGW,也可以這樣來編譯:gcc -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at -Id:/java/include –Id:/java/include/win32 -shared -o (輸出的dll文件名,如sum.dll) (輸入的c/c++源文件,如abc.c)。
6) 運行程序
javaHelloWorld就ok.
如果用eclipse,需將dll或so文件放在項目下,而不是src及其子目錄下。
如果用命令行編譯,把dll文件放在該包的同目錄下。
『貳』 JAVA中用JNI調用了在WIN32下編譯的DLL,如果在linux下執行這個JAVA程序,是否還可以繼續調用的DLL。
直接是不行的! linux裡面沒有dll。
不過看你的需求應該是java調用了其他程序別寫的功能,在linux裡面肯定可以!Linux也有動態鏈接庫的概念,不過叫Share Object ,你編譯一個.so的文件,然後還是使用JNI調用。
參考:
編譯so:http://www.cnblogs.com/ardar/articles/357321.html
java調用:http://..com/question/488673981.html
『叄』 java中怎麼編寫dll文件........最好舉個例子
你是指使用動態鏈接嗎?這個可以用java中的反射機製做到,但是java中是沒有動態鏈接庫這種東西的。如果你指的是java調用本地dll的話,是使用jni技術,dll也不是java編寫的。總是java是不可能編譯成為dll。有一種這種的方案,就是將java編譯的文件轉換為c#的,微軟有相應的工具,可以搜到,然後就可以打包成為dll了。
『肆』 System.IO.FileNotFoundException JAVA調用的時候出這個錯誤,c++調用的時候正常執行
這個首先這個異常的名稱是文件沒有找到,你應該是通過java的JNI的來調用dll文件吧。
java使用JNI調用dll,一般會把dll文件放到系統system32文件夾下或者JDK下的bin目錄裡面
『伍』 把c文件編譯成dll文件
1、Ic -->Id
2、你的jdk裝沒裝,沒裝的話找找裝上,提示NO such file or directory
裝了的話,找找你安裝的文件夾替換上
『陸』 java使用JNI調用VC6.0編寫的動態鏈接庫dll,如何移植到linux環境下使用
你想要的應該基本不可能實現了,gpsun.lib是在window下生成的靜態庫,是不能在linux上直接調用的,如果你清楚gpsin的實現,可以在linux下編一個自己的靜態庫,是以.a結尾的,然後在linux上編譯.so文件時將這個.a文件鏈接進去,最後就可以用jni去調用了
『柒』 clion編譯jni,找不到jni.h的解決辦法
在windows環境下生成的動態庫是 dll
在linux下生成so
在mac下生成的是dylib
所以對於Android的開發者來說,還是要用ndk的工具
把在idea生成的.h文件粘貼到clion的項目中就可以了,
如果找不到jni.h可以在CMakeList.txt中添加對jni.h文件的引用
如下:
後面三行根據jdk的實際位置填寫,作用是導入jni相關的頭文件;其他的操作系統可能不完全一致
復制.h頭文件 com_shenby_jni_JniExample.h
實現該文件定義的函數 com_shenby_jni_JniExample.c
在CMakeList.txt中添加生成動態共項庫
add_library:生成一個庫,add_executable:生成一個可執行文件
hello:是生成共享庫的名字,前面會自動加上lib前綴,如這里windows生成的是 libhello.dll
SHARED:庫的類型為動態,windows上生成.dll,而STATIC 則是生成靜態庫,windows生成.a文件
com_shenby_jni_JniExample.c :c源文件,多個文件就添加在後面,切記不能添加上面的com_shenby_jni_JniExample.h
文件,否則生成的庫中的函數為空
結果如下
就可以把該dll文件粘貼到idea的項目根目錄中運行了
『捌』 java 調用動態鏈接庫(jni方式調用dll文件)
jni 是由Java調用C/C++的動態鏈接庫 (DLL)。
所以把.class-->.h-->dll ,想法是不正確的,
同時也違背了Jni的初衷。
Dll是由C/C++生成的。
以前的一個項目用到了Java調用C/C++的DLL,所以對這個還算熟悉。
那個dLL是由C++程序員寫的,在Microsoft Visual C++ 6.0編輯器中可以生成。然後由Java程序員用JNI來調用DLL裡面實現的功能(方法)。