Hallo zusammen,
ich schreibe gerade ein Programm das JNI nutzen soll um C++ Code auszuführen.
Ich nutzte dabei Eclipse und MS Visual C++ 2008 Express auf einem WindowsXP System.
Bei Testen im kleinen Rahmen bin ich auf ein Problem gestoßen, das ich nicht lösen kann.
Es tritt hier auf:
In der Konsole zeigt sich folgendes:
Der Konstruktor für Snapshot sieht so aus:
Die Methode getComplete() wurde in einer anderen Klasse als native deklariert und in C++ implementiert.
Sie soll ein Snapshot- Objekt erstellen und es dann an das Javaprogramm zurückgeben
Der C++ Code wurde dann in eine DLL kompiliert.
Eigentlich sollte ja das Programm die Int- Variable und die beiden Arrays ausgeben.
Aber wie man sieht, der Int-Wert ist falsch und die Arrays nicht vorhanden.
Ich weiß aber nicht, wie ich den C++ Code abändern müsste, um das Problem zu beheben.
Das es am Java Code liegt kann ich mir nicht vorstellen.
Ich bin für jeden Lösungsvorschlag dankbar.
ich schreibe gerade ein Programm das JNI nutzen soll um C++ Code auszuführen.
Ich nutzte dabei Eclipse und MS Visual C++ 2008 Express auf einem WindowsXP System.
Bei Testen im kleinen Rahmen bin ich auf ein Problem gestoßen, das ich nicht lösen kann.
Es tritt hier auf:
Code:
public static void main(String[] args)
{
DesktopImpl impl = new DesktopImpl();
Snapshot x = impl.getComplete();
System.out.println("Count: " + x.count);
System.out.println(x.bytes[0]+", "+x.bytes[1]);
System.out.println(x.changes[0]+", "+x.changes[1]);
}
In der Konsole zeigt sich folgendes:
Code:
Count: 580449256
Exception in thread "main" java.lang.NullPointerException
at de.cworxmedia.rds.server.test.main(test.java:17)
Der Konstruktor für Snapshot sieht so aus:
Code:
public Snapshot(int count, byte[] bytes, int[] changes)
{
this.count = count;
this.bytes = bytes;
this.changes = changes;
}
Die Methode getComplete() wurde in einer anderen Klasse als native deklariert und in C++ implementiert.
Sie soll ein Snapshot- Objekt erstellen und es dann an das Javaprogramm zurückgeben
Code:
JNIEXPORT jobject JNICALL Java_de_cworxmedia_rds_natives_Win32Desktop_getComplete
(JNIEnv *env, jobject jc)
{
jclass jclass = env->GetObjectClass(jc);
jmethodID jmid = env->GetMethodID(jclass, "<init>", "()V");
jint jcount = 345;
jbyteArray jbytes = env->NewByteArray(2);
jintArray jchanges = env->NewIntArray(2);
jbyte *jbytesbuf = env->GetByteArrayElements(jbytes, 0);
jint *jchangesbuf = env->GetIntArrayElements(jchanges, 0);
jbytesbuf[0] = (BYTE) 22;
jbytesbuf[1] = (BYTE) 23;
jchangesbuf[0] = (jint) 5;
jchangesbuf[1] = (jint) 46723;
jobject jo = env->NewObject(jclass, jmid, jcount, jbytes, jchanges);
return jo;
}
Der C++ Code wurde dann in eine DLL kompiliert.
Eigentlich sollte ja das Programm die Int- Variable und die beiden Arrays ausgeben.
Aber wie man sieht, der Int-Wert ist falsch und die Arrays nicht vorhanden.
Ich weiß aber nicht, wie ich den C++ Code abändern müsste, um das Problem zu beheben.
Das es am Java Code liegt kann ich mir nicht vorstellen.
Ich bin für jeden Lösungsvorschlag dankbar.