2014-12-30 118 views
0

我開始研究Java的JNI功能。我遵循這個[教程] [1]。所以我的課是這樣的:甚至在編譯好之後,JNI UnsatisfiedLinkError

package me.gagan.pheonix.natve; 
    public class HelloJNI { 
     static { 
      System.loadLibrary("hello"); 
     } 
     private native void sayHello(); 
     public static void main(String... args) { 
     new HelloJNI().sayHello(); 
     } 
    } 


HelloJNI.c file like this: 

    \#include <jni.h> 
    \#include <stdio.h> 
    \#include "me_gagan_pheonix_natve_HelloJNI.h" 
    JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) { 
     printf("Hello World in native C!\n"); 
     return; 
    } 

我的目錄結構是:

<pre> 
C:. 
├───bin 
│ ├───me 
│ │ └───gagan 
│ │  └───pheonix 
│ │   └───natve 
│ │    └───HelloJNI.class 
│ ├───resources 
│ │ └───hello.dll 
│ ├───me_gagan_pheonix_natve_HelloJNI.h 
│ └───HelloJNI.c 
└───src 
    ├───me 
    │ └───gagan 
    │  └───pheonix 
    │   └───natve 
    │    └───HelloJNI.java 
    └───resources 
</pre> 

我還添加了

-Djava.library.path=C:\Gagan\workspace\Pheonix\bin\resources 

但還是錯誤來了。任何想法出了什麼問題。正確地跟隨每一步。 以下命令爲我工作

gcc -Wl,--add-stdcall-alias -I"%JAVA_HOME%\include" -I"%JAVA_HOME%\include\win32" -shared -o hello.dll HelloJNI.c 

    echo %JAVA_HOME% 
    C:\Java\jdk1.6.0_45 

    javah -verbose -jni -classpath . me.gagan.pheonix.natve.HelloJNI 

編輯:遇到

的例外是:有什麼建議

Exception in thread "main" java.lang.UnsatisfiedLinkError: me.gagan.pheonix.natve.HelloJNI.sayHello()V 
    at me.gagan.pheonix.natve.HelloJNI.sayHello(Native Method) 
    at me.gagan.pheonix.natve.HelloJNI.main(HelloJNI.java:12) 


    [1]: https://www3.ntu.edu.sg/home/ehchua/programming/java/JavaNativeInterface.html 

嗨任何人?

回答

0
package me.gagan.pheonix.natve; 
public class HelloJNI { 
... 
JNIEXPORT void JNICALL Java_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) { 

在生成帶有javah的.h文件後,您已更改軟件包名稱。再次執行此操作,並相應地調整.c文件中的函數名稱,以同意.h文件中的聲明。

+0

唉很好的接收,謝謝我嘗試並將更新。謝謝EJP – Gagan

+0

謝謝你的工作。 – Gagan