Java-JNI - zuordnen von Ressourcen in C mit java-Objekten?
Will ich weisen Sie einige der Speicher in C und halten Sie es im Zusammenhang mit einem java-Objekt-Instanz, wie diese:
void configure(JNIEnv *object, jobject obj, ....) {
char *buf = new char[1024];
//associated <buf> with <obj> somehow
}
Und dann später den Speicher frei, wenn das java-Objekt wird Müll gesammelt - ich könnte dies tun, indem Sie den Aufruf einer JNI-Funktion aus dem finalize() - Methode des java-Objekt.
Die Frage ist, wie Verbinde ich einen C-pointer mit dem java-Objekt? Halten Sie eine lange - Feldes in der Objekt-und der cast der Zeiger auf langen? Gibt es einen besseren Weg?
- dup: stackoverflow.com/questions/214699/...
- Art, in dieser Frage gibt es keine Diskussion darüber, wie die Zuordnung der C-Objekt der java-Instanz. Im vorgestellten Beispiel wird der Zeiger casten zu lange. Ist dies der einzige Weg?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Regel, wenn Sie übertragen wollen, um einen Zeiger von C nach Java, empfohlen
long
so, dass es genug bits zum halten der Zeiger value, im Fall der Plattform ist 64 bit.Dann haben Sie einen Blick auf
ByteBuffer.allocateDirect()
schafft einenByteBuffer
Instanz, welcher Speicher genutzt werden kann C. Sie können reservieren solchen direktenByteBuffer
von der Java-Seite wird dann übergeben Sie es alsjobject
auf eine JNI-Funktion und innerhalb dieses JNI-Funktion verwenden Sie dieGetDirectBufferAddress
Funktion.Eine andere Möglichkeit ist, wickeln Sie einen einheitlichen Speicherbereich mit der
NewDirectByteBuffer
JNI-Funktion von der nativen Seite. Es gibt Ihnen einejobject
übergeben Sie zurück an die Java-Seite (achten Sie auf die lokalen und globalen Referenzen). Achten Sie auf die Tatsache, dass, nachdem die direkteByteBuffer
umschließt, die den nativen Speicher erstellt wurde, Sie sind immer noch verantwortlich für die Verwaltung der native Speicher: an einem gewissen Punkt, Sie haben zu nennendelete buf;
in Ihrem nativen code, Java wird es nicht tun für Sie.finalize
läuft. Der einzige Nachteil ist, dass Sie nicht genau wissen, Wann der garbage collector geht, so dass Sie nicht wirklich wissen, Wann der Speicher freigegeben abgesehen, dass es geht, um veröffentlicht zu werden, nachdem Sie fertig sind mit dem Puffer.Java haben kein Konzept von native-Zeiger, so speichern Sie es als eine lange, ist die einzige wirkliche option. Aber Sie sollten sich nicht auf
finalize
free der Zeiger; die finalize-Methode ist unzuverlässig als Mittel der Reinigung Ressourcen. Sehen diese Frage für weitere details.