मैं सी ++ में मूल सूची बनाने और जावा में इसका उपयोग करने की कोशिश कर रहा हूं, मुझे पूरा यकीन है कि सब कुछ सही घोषित किया गया है लेकिन मुझे एक लिंक त्रुटि मिल रही है
जावा अपवाद:
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));
}
मैं इस परियोजना के लिए विजुअल स्टूडियो का उपयोग कर रहा हूं, परियोजना केवल डीएलएल नहीं बल्कि कई फाइलें बनाती है, मुझे नहीं पता कि यह समस्या है या नहीं। फ़ाइलें
1 उत्तर
आपके जावा वर्ग के नाम और विधि के नाम में अंडरस्कोर है, जो नामकरण परंपरा के विरुद्ध है।
यदि आप उन्हें रखने पर जोर देते हैं, तो आपको अपने C++ फ़ंक्शन का नाम बदलकर Java_Java_1List_init_1list
करना होगा। List
और list
से पहले 1
s पर ध्यान दें, जो लिंकर को एक नामकरण विभाजक के बजाय एक शाब्दिक अंडरस्कोर वर्ण के रूप में पूर्ववर्ती अंडरस्कोर की व्याख्या करने के लिए कहता है।
संबंधित सवाल
नए सवाल
java
जावा एक उच्च स्तरीय प्रोग्रामिंग भाषा है। इस टैग का उपयोग तब करें जब आपको भाषा का उपयोग करने या समझने में समस्या हो। इस टैग का उपयोग शायद ही कभी किया जाता है और इसका उपयोग अक्सर [वसंत], [वसंत-बूट], [जकार्ता-ई], [Android], [javafx], [हडूप], [श्रेणी] और [मावेन] के साथ किया जाता है।