2011-04-08 63 views
2

EDIT3:如果我使用微軟的編譯器從命令行進行編譯,那麼編譯器的標記會導致問題。有誰知道我需要在code :: blocks中更改以解決此問題嗎?運行一個非常簡單的Hello World JNI測試時出現問題

當我運行我的代碼時,我得到一個UnsatisfiedLinkError。加載步驟工作正常,我實際上調用代碼時出現錯誤。

入門的路徑,我的DLL

java -Djava.library.path=E:\Java\JNIHellowWorld\PasswordGenHW\bin\Debug -jar dist\JNIHellowWorld.jar 

例外

Exception in thread "main" java.lang.UnsatisfiedLinkError: jnihellowworld.Main.HelloWorld()Ljava/lang/String; 
     at jnihellowworld.Main.HelloWorld(Native Method) 
     at jnihellowworld.Main.main(Main.java:16) 

Java代碼的

package jnihellowworld; 
import java.io.IOException; 
public class Main { 
    public native String HelloWorld() throws Error; 
    public static void main(String[] args) throws IOException { 
     try 
     { 
     System.loadLibrary("PasswordGenHW"); 
     String test = new Main().HelloWorld(); //errors on this line 
     System.out.println(test); 
     System.in.read(); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 
    } 
} 

C++頭

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

#ifndef _Included_jnihellowworld_Main 
#define _Included_jnihellowworld_Main 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  jnihellowworld_Main 
* Method: HelloWorld 
* Signature:()Ljava/lang/String; 
*/ 
JNIEXPORT jstring JNICALL Java_jnihellowworld_Main_HelloWorld 
    (JNIEnv *, jobject); 

#ifdef __cplusplus 
} 
#endif 
#endif 

C++ CPP

#include "jnihellowworld_Main.h" 
#include <jni.h> 

JNIEXPORT jstring JNICALL Java_jnihellowworld_Main_HelloWorld 
    (JNIEnv *env, jobject obj) 
    { 
     return env->NewStringUTF("Hello world!"); 
    } 

我使用的代碼::塊和海灣合作委員會complle的DLL。

編輯:這裏是DUMPBIN/DLL的出口

2 1 000011D8 [email protected] 

EDIT2:簡化項目中用System.loadLibrary()

+0

它在更直接的配置中工作嗎? – biziclop 2011-04-08 19:03:57

+0

嘗試複製dll到當前目錄並使用'System.loadLibrary(「PasswordGenHW」);' – 2011-04-08 19:08:15

+0

仍然有錯誤,我更改了示例代碼以使用loadlibrary。 – 2011-04-08 19:10:21

回答

0

我最終只是使用微軟的編譯器手動編譯。

0

嘗試添加上編輯這些標誌複製錯誤和聯繫:

-Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at 

例如:

gcc -c -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at test.c 

gcc -shared -D_JNI_IMPLEMENTATION_ -Wl,--kill-at test.o -o mylib.dll 
相關問題