עבור לתוכן

DLL מי מכיר?

Featured Replies

פורסם

אני מנסה לפתוח קובץ DLL <שJAVAV תפתח פונקציות הכתובות ב++C>

זה מה שעשיתי:

++C קובץ הצהרה


JNIEXPORT jint JNICALL Java_Targil1_begingMasseage
(JNIEnv *, jobject, jchar*);

++C קובץ cpp


JNIEXPORT jchar* JNICALL Java_Targil1_begingMasseage
(JNIEnv *env, jobject obj)
{
char* message = new char[80];
message = "Hello World";
return message;
}

JAVAקובץ


ublic class Targil1
{
public native String begingMasseage();

public static void main(String[] args)
{
System.loadLibrary("Targil1");
Targil1 tar = new Targil1();
String message = tar.begingMasseage();

System.out.println("begingMasseage: " + message);

}
}

וזה מה שהקומפיילר רושם לי:


Exception in thread "main" java.lang.UnsatisfiedLinkError: begingMasseage
at Targil1.begingMasseage(Native Method)

יש פתרון מה לעשות??

  • תגובות 41
  • צפיות 3.8k
  • נוצר
  • תגובה אחרונה
פורסם

אולי מדובר בבעיית PATH. את מריצה את הקובץ class/jar מאותה תיקיה שנמצא הקובץ Targil1.dll ?

פורסם
  • מחבר

אכן חסר לי קובץ DLL אחד.

איפה אני מוצאת אותו?

פורסם

מה הכוונה חסר ? את צריכה לקמפל את הקוד ב C++ ל DLL...

פורסם
  • מחבר

יש לי בעיה בפתיחת הקבצים איפה אני עושה כל דבר.

אני פותחת את ++C ואז איפה אני פותחת את JAVA (אני עובדת בסביבת ECLIPSE)? לאותו קובץ שפתחתי את ++C? ???

פורסם

לא הבנתי מה אמרת... האם הצלחת דבר ראשון לקמפל את קבצי ה C/C++ לקבצי DLL ?[br]פורסם בתאריך: 8.03.2007 בשעה 16:36:36


אולי זה יסביר, מתחילים עם (הכל פה באותה תיקיה) JNIExample.java

class JNIExample {
public native String testing();

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

public static void main(String[] args) {
System.out.println("testing: " + new JNIExample().testing());
}
}

מקפלים את זה עם javac, אחרי זה יוצרים קובץ stub עם javah:

javac JNIExample.java

javah JNIExample

אחרי זה יוצרים קובץ JNIExample.c:

#include <jni.h>

JNIEXPORT jstring JNICALL Java_JNIExample_testing (JNIEnv *env, jobject obj)
{
char *test;
return (*env)->NewStringUTF(env, "hi there");
}

שאותו מקמפלים (במקרה הזה עשיתי את זה עם הקומפיילר של מיקרוסופט ויזואל סטודיו):

cl JNIExample.c -FeJNIExample.dll -LD -I"c:\Program Files\Java\jdk1.5.0_06\include" -I"c:\Program Files\Java\jdk1.5.0_06\include\win32"

להחליף רק את התיקיות של איפה שנמצא ה JDK במחשב.

לבסוף מריצים את הקוד JAVA:

java JNIExample

testing: hi there

פורסם
  • מחבר

אה תודה!

עוד בעיה:

יש לי פונקציה שעובדת- ואם אני משנה לה את השם , וקוראת לה בשמה החדש, היא לא עובדת.

למה??????????

JAVA


public native String begingMasseage(String message);

public static void main(String[] args)
{
System.loadLibrary("Targil1");
Targil1 tar = new Targil1();
String message = tar.begingMasseage("begin Masssage");

System.out.println("begingMasseage: " + message);
}


++C CPP


JNIEXPORT jstring JNICALL Java_Targil1_begingMasseage
(JNIEnv *env, jobject obj, jstring message)
{
const char *str = env->GetStringUTFChars(message, 0);
char m[80];
strcpy(cap, str);
env->ReleaseStringUTFChars(message, str);
return env->NewStringUTF(m);
}

פורסם

את צריכה לקמפל מחדש את כל הקוד, גם ה JAVA וגם ה C++. תפרטי בדיוק מה זה לא עובדת (איזה שגיאה מקבלים וכו'..)

פורסם
  • מחבר

הקובץ ++C מתקמפל וJAVA לא.

המוזר הוא שהתכנית עבדה, ואז שיניתי רק את השם של הפונקציה <בקובץ JAVA, H , CPP> וזה הפסיק לעבוד ורשם לי ההערה הנ"ל

פורסם

אפשר להתחיל לתת שמות נכונים באנגלית, זה אף פעם לא מזיק. בכל מקרה, מה השגיאה שה JAVA נותן בקימפול (ואיפה הקוד העדכני)...

פורסם
  • מחבר

כשאני אדע אנגלית אני אתן בשמחה שמות נכונים- כרגע זו נקודה כאובה :'(

השגיאה שנותן:


Exception in thread "main" java.lang.UnsatisfiedLinkError: begingMasseage
at Targil1.begingMasseage(Native Method)

פורסם

זה כשאת מריצה, לא מקמפלת.. תראי את כל הקבצים (ותבדקי את שמות הקבצים ושאת עושה הכל מאותה תיקיה).

פורסם
  • מחבר

קובץ הJAVA מתקמפל ונתקע בהרצה.

זה הגיוני שפעם אחת זה עובד, ופעם אחרת רק בשינוי שם הפונקציה זה נתקע??

פורסם

עם JNI הכל אפשרי, השאלה מה את עושה, יותר הגיוני שהטעות היא שם בתהליך...(תמחקי את כל קבצי ה CLASS ו DLL, ותיצרי אותם מחדש, אחרי שבדקת שההגדרת של השמות בסדר, גם ב C וגם ב JAVA).

פורסם
  • מחבר

שאלה קצת אחרת:

יש אפשרות ליצור קובץ DLL עם ++c גרסה 6.0 ?? ???

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים