मैं सी ++ में मूल सूची बनाने और जावा में इसका उपयोग करने की कोशिश कर रहा हूं, मुझे पूरा यकीन है कि सब कुछ सही घोषित किया गया है लेकिन मुझे एक लिंक त्रुटि मिल रही है

जावा अपवाद:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Java_List.init_list(Ljava/lang/Object;)J
        at Java_List.init_list(Native Method)
        at Java_List.main(Java_List.java:13)

जावा स्रोत

public class Java_List
{
    static
    {
        System.loadLibrary("JAVA_JNI_FTC");
    }

    public native long init_list(Object a);

    public static void main(String[] args)
    {
        Java_List list = new Java_List();
        System.out.println(list.init_list(list));
    }

}

शीर्ष लेख फ़ाइल

#include <jni.h>
#include "List.h"
#include <new>

#ifndef _Included_JAVA_LIST
#define _Included_JAVA_LIST
#ifdef __cplusplus
extern "C" {
#endif
    /*
     * Class:     HelloJNI
     * Method:    sayHello
     * Signature: ()V
     */
    JNIEXPORT jlong JNICALL Java_Java_List_init_list(JNIEnv *, jobject, jobject);
    JNIEXPORT jobject JNICALL Java_Java_List_list_get(JNIEnv *env, jobject thisObj, jint index, jlong list);

#ifdef __cplusplus
}
#endif

typedef struct Java_List Java_List;

struct Java_List
{
    void *list;
    jclass type;
};

void init_Java_List(Java_List *jList, jclass type);
jobject java_list_get(Java_List *jList, int index);
#endif

सी ++ स्रोत

#include <jni.h>
#include "Java_List.h"  
#include "pch.h"


extern "C"
{
    JNIEXPORT jlong JNICALL Java_Java_List_init_list(JNIEnv *env, jobject thisObj, jobject classType)
    {
        jclass type = env->GetObjectClass(classType);
        Java_List *list = (Java_List *)malloc(sizeof(Java_List));
        init_Java_List(list, type);
        return (jlong)list;
    }

    JNIEXPORT jobject JNICALL Java_Java_List_list_get(JNIEnv *env, jobject thisObj, jint index, jlong list)
    {
        return java_list_get((Java_List *)list, (int)index);
    }
}
/* jni api*/
void init_Java_List(Java_List *jList, jclass type)
{
    jList->list = malloc(sizeof(List<jobject>));
    new (jList->list) List<jobject>();
    jList->type = type;
}

jobject java_list_get(Java_List *jList, int index)
{
    List<jobject> *list = (List<jobject> *) jList->list;
    return *(list->get(index));
}

मैं इस परियोजना के लिए विजुअल स्टूडियो का उपयोग कर रहा हूं, परियोजना केवल डीएलएल नहीं बल्कि कई फाइलें बनाती है, मुझे नहीं पता कि यह समस्या है या नहीं। फ़ाइलें

2
cam6577 25 सितंबर 2019, 08:27

1 उत्तर

सबसे बढ़िया उत्तर

आपके जावा वर्ग के नाम और विधि के नाम में अंडरस्कोर है, जो नामकरण परंपरा के विरुद्ध है।

यदि आप उन्हें रखने पर जोर देते हैं, तो आपको अपने C++ फ़ंक्शन का नाम बदलकर Java_Java_1List_init_1list करना होगा। List और list से पहले 1s पर ध्यान दें, जो लिंकर को एक नामकरण विभाजक के बजाय एक शाब्दिक अंडरस्कोर वर्ण के रूप में पूर्ववर्ती अंडरस्कोर की व्याख्या करने के लिए कहता है।

2
Michael 25 सितंबर 2019, 10:52