2015-03-19 72 views
0

我在爲C++做JNI教程,並且能夠成功構建。但是,當我嘗試運行時,出現此錯誤彈出窗口「無法啓動程序C:... \ CLibHelloWorld.dll」。 資源教程我也跟着爲: http://electrofriends.com/articles/jni/jni-part1-java-native-interface/ http://electrofriends.com/articles/jni/part-2-jni-visual-studio-setup-dll-project/由於.dll(JNI)無法啓動程序

我做得不對我這裏的.dll配置?我確實改變了我的「附加包含目錄」,並且我的Java正在工作,因爲我能夠將java.class文件編譯爲.header文件。

我編譯ClibHelloWorld.h文件

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class HelloWorld */ 

#ifndef _Included_HelloWorld 
#define _Included_HelloWorld 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  HelloWorld 
* Method: print 
* Signature:()V 
*/ 
JNIEXPORT void JNICALL Java_HelloWorld_print 
    (JNIEnv *, jobject); 

#ifdef __cplusplus 
} 
#endif 
#endif 

我ClibHelloWorld.cpp是:

#include "HelloWorld.h" 
#include "jni.h" 
#include "stdio.h" 

JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj) 
{ 
    printf("Hello world\n"); 
    return; 
} 
+0

無法啓動程序?我希望只有在嘗試將DLL作爲應用程序啓動時纔會出現這樣的消息。你的命令行是什麼啓動你的測試程序? – user2543253 2015-03-19 10:30:16

+0

我剛剛編譯,構建並運行在Visual Studio 2013最終,然後我得到這個錯誤 – 2015-03-20 14:32:17

+0

Visual Studio只能建立DLL。你不能運行一個DLL。我將寫這個答案。 – user2543253 2015-03-20 15:53:59

回答

0

您不能運行的DLL。爲了「運行」一個JNI DLL,你還需要一個使用該DLL的Java程序。你的情況可能是這樣

public static void main(String argv[]) { 
    new HelloWorld().print(); 
} 

Java運行時會檢測到「打印」是一個本地方法,將加載DLL和調用的函數那裏。爲了能夠從Visual Studio中調試DLL,最好的選擇是在VS項目屬性的「調試」部分輸入「java」調用。 (也可以將VS調試器附加到正在運行的Java進程中,但通常在完成之前就會完成簡短的程序)

JNI是一種使Java和本機平臺代碼之間可以進行接口的技術。一種用法是從Java調用(通常)C代碼。這就是你的教程所做的。另一個用途是從C調用Java代碼。這有點複雜,還有其他教程介紹如何做到這一點,但只有在這種情況下,您才能構建一個EXE,Visual Studio可以「剛剛開始」。

+0

我已經有這個Java程序。但是當我執行「java HelloWorld」時出現了一個錯誤,它無法檢測到我的dll。我能夠構建它 – 2015-03-23 03:47:22

+0

有大量的文章解釋瞭如何讓Java找到本機庫。在java調用中使用'-Djava.library.path = '來傳遞包含該DLL的目錄。 (如果你不是從命令行調用java,而是將java調用放入Visual Studio項目屬性中,則可以使用VS變量來獲取構建DLL的正確目錄。) – user2543253 2015-03-23 10:22:08

+0

這不是很有幫助所有。我解決了我自己的錯誤。 – 2015-03-24 01:45:31

0

我認爲這段代碼只是.dll,它會在父Debug文件夾中生成一個.dll文件。

創建一個HelloWorld.java並使用javac將它編譯成一個.class文件 然後使用javah創建一個頭文件。 然後在命令提示符下運行「java HelloWorld」來運行該程序並在java程序中加載用C++編寫的代碼

相關問題