Pertanyaan Java Native Access tidak melakukan C ++, bukan?


Saya telah menemukan banyak referensi online (termasuk beberapa di stackoverflow) ke JNA yang digunakan untuk pustaka C ++, tetapi tidak ada yang dapat saya temukan di dokumen JNA menunjukkan itu mungkin. Sepertinya tidak ada cara untuk membungkus kelas C ++, khususnya.

Saya memerlukan akses asli untuk menggunakan RTAudio, tetapi semua fungsi RTAudio adalah fungsi anggota kelas RTAudio. Jadi hanya untuk memastikan, JNA bukan cara yang tepat?


8
2018-02-11 01:48


asal


Jawaban:


Apa yang ditanyakan pertanyaan ini adalah bertanya bagaimana memanggil metode instance C ++ menggunakan JNA, dan itu mungkin, tetapi Anda harus melakukan beberapa pekerjaan. Secara khusus, Anda harus menulis pembungkus yang extern "C"fungsi apa pun yang Anda perlukan untuk memohon.

Untuk setiap sewenang-wenang type* function() definisi Anda dapat memetakan metode menggunakan JNA sebagai mengembalikan a com.sun.jna.Pointer, tetapi Anda tidak akan dapat memohon metode pada objek C ++ dari JNA.

Sebuah solusi sederhana untuk ini adalah dengan menulis pustaka antarmuka C yang hanya memanggil metode pada objek untuk Anda ... jadi jika Anda memiliki beberapa fungsi anggota foo() Anda bisa mengekspor metode C dari kode C ++ Anda:

extern "C" void bar(type* var){
   var->foo();
}

Tentunya ini akan menambah beberapa pekerjaan untuk Anda ... tapi saya menduga overhead untuk beralih ke JNI akan hampir sama.

JNA hanya peduli tentang cara di mana metode diekspor dalam DLL - dan itu harus tanpa C ++ dekorasi (karenanya extern "C"), sehingga Anda dapat melakukan apa pun yang Anda perlukan dalam metode apa pun tanpa mengekspos metode yang Anda hubungi.

Dalam contoh yang saya buat di atas, ini berarti itu foo(), selama itu didefinisikan dalam DLL bahkan tidak harus diekspos. Karena ini adalah fungsi C ++, JNA tidak dapat memanggilnya secara langsung, tetapi dapat dipanggil dari dalam fungsi yang dapat dipanggil oleh JNA, itulah mengapa solusi yang saya usulkan berfungsi.

Jadi, ya, Anda dapat sepenuhnya mengenkapsulasi panggilan ke semua fungsi anggota (buat, operasikan, hancurkan) dalam satu fungsi dan JNA tidak akan peduli.


11
2018-02-11 04:48



Mencoba Swig. Ini akan membuat bungkus untuk kelas c ++ untuk Anda.


2
2018-02-11 04:16



BridJ adalah anak spiritual JNA yang menambahkan beberapa dukungan C ++ terbatas (+ dukungan penuh dari JNAerator). Jika Anda tidak menggunakan terlalu banyak template, itu mungkin hanya berfungsi ...

(disclaimer: Saya adalah pengarang BridJ & JNAerator)


2
2018-02-19 17:03



Youre right JNA adalah untuk mengakses pustaka asli. Saya pikir apa yang Anda butuhkan adalah Java - COM Bridge. Jika ini terjadi, ada beberapa alternatif gratis:

JCOM http://sourceforge.net/projects/jcom

Jacob http://sourceforge.net/projects/jacob-project

Saya telah menggunakan Jacob dalam umpan dengan hasil yang bagus, tapi saya pikir itu agak ketinggalan jaman.


1
2018-02-11 02:00