2012-04-23 10 views
5

मैं विंडोज एक्सपी चला रहा हूं। जाहिर है JNI और UnsatisfiedLinkError चलते ... मैंने देखा है कि समय के सबसे अधिक, लिंकर त्रुटि इस तरह दिखता है:जेएनआई - देशी विधि पर असंतुष्ट लिंक्स त्रुटि

java.lang.UnsatisfiedLinkError: no whatever.dll in java.library.path 

लेकिन वह मेरी समस्या नहीं है; जावा मेरा डीएलएल पा सकता है।

java.lang.UnsatisfiedLinkError: NativeTest.nativemethod(lJava/lang/String;)Z 

मैं की तरह this one, this one, this one, this one, और this one, लेकिन कोई भी StackOverflow पर समान सवालों की एक संख्या को देखकर की कोशिश की है: मैं एक त्रुटि है कि मुझे मैं अपने विधि गलत नामित लगता हो रही है इन तरीकों से काम किया है। मुझे उबंटू मंचों पर this thread भी मिला, जहां यह ठीक उसी समस्या की तरह दिखता है, लेकिन सवाल पूछने वाले ने यह नहीं कहा कि उन्होंने अपनी समस्या कैसे तय की है (जो वास्तव में बेकार है)। इस पर सभी Google खोजों ने मुझे java.library.path के समान त्रुटि दी है।

मेरा वास्तविक कोड यहां है।

NativeTest.java

class NativeTest 
    { 

    public static native boolean nativemethod (String arg); 

    public static void main (String[] args) 
     { 
     System.out.println(nativemethod("")); 
     System.out.println(nativemethod("012")); 
     } 

    static { System.loadLibrary("NativeTest"); } 

    } 

NativeTest.h

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

#ifndef _Included_NativeTest 
#define _Included_NativeTest 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  NativeTest 
* Method: nativemethod 
* Signature: (Ljava/lang/String;)Z 
*/ 
JNIEXPORT jboolean JNICALL Java_NativeTest_nativemethod 
    (JNIEnv *, jclass, jstring); 

#ifdef __cplusplus 
} 
#endif 
#endif 

NativeTest.c

#include <jni.h> 
#include <windows.h> 
#include "NativeTest.h" 

JNIEXPORT jboolean JNICALL Java_NativeTest_nativemethod 
    (JNIEnv* Jenv, jclass Jref, jstring Jarg) 
    { 
    MessageBox(NULL, "text", "title", MB_OK); 
    int len = (*Jenv)->GetStringLength(Jenv, Jarg); 
    return (jboolean)(len > 5); 
    } 

सेमी में d.exe: (जीसीसी आदेश विभिन्न आदेशों मैं इंटरनेट पर मिल गया है की मेरी गोलमाल है।)

>javac NativeTest.java 

>javah -jni NativeTest 

>gcc -shared -I<jdk_dir>\include -I<jdk_dir>\include\win32 -oNativeTest.dll NativeTest.c -lgdi32 

>java -Djava.library.path=. NativeTest 
Exception on thread "main" java.lang.UnsatisfiedLinkError: NativeTest.nativemethod(Ljava/lang/String;)Z 
     at NativeTest.nativemethod(Native Method) 
     at NativeTest.main(NativeTest.java:8) 

>java NativeTest 
Exception on thread "main" java.lang.UnsatisfiedLinkError: NativeTest.nativemethod(Ljava/lang/String;)Z 
     at NativeTest.nativemethod(Native Method) 
     at NativeTest.main(NativeTest.java:8) 
+1

मैंने आपके कोड पर नजदीक नज़र डाली है, लेकिन क्या आपने इसके बजाय जेएनए का उपयोग करने पर विचार किया है? तब आपको जेएनआई की अप्रासंगिकता के बारे में चिंता करने की ज़रूरत नहीं होगी। – rob

+0

जेएनए को भी नहीं पता था। मैं इस पर गौर करूंगा। धन्यवाद :) – nuju

+0

आपके जावा कोड में आप जिस पैकेज का नाम उपयोग कर रहे हैं वह क्या है? – ioums

उत्तर

4

चारों ओर खिलवाड़ और दिन के आधे के लिए एक ही समस्या हल करने के लिए googling के बाद, मेरे पास है पाया गया कि जीसीसी डीएलएल उत्पन्न नहीं करता है जहां जेवीएम प्रतीकों को हल कर सकता है। लेकिन कोई भी जीसीसी को सही कमांड लाइन तर्क दे सकता है और फिर यह काम करता है:

इस विषय पर this MinGW पोस्ट देखें। एक को अतिरिक्त झंडे के रूप में "-D_JNI_IMPLEMENTATION_ -Wl, - मार डालो" पास करने की आवश्यकता है। पता नहीं है कि उनमें से सभी की जरूरत है या सिर्फ पहले बिट।

+1

आप महोदय, अधिक ध्यान देने योग्य हैं। मैंने आधे दिन बिताए इसे समझने की कोशिश की। जब मैंने आपका जवाब देखा तो SO पर एक समान प्रश्न पूछने वाला था। –

संबंधित मुद्दे