Аз съм нов в JNA. в моето едно приложение трябва да върна char * aarr= new char[200] на java от c. Не мога да разбера как да направя това. Какъв трябва да бъде типът връщане на моята c++ функция? И как трябва да декларирам моя java метод, за да съживя масива char? Има ли някакъв друг начин като предаване на променлива по референция в c++, за да получите стойността на char[] на c++?
Как да върна char * aarr= new char[200] от C++ към Java с помощта на JNA
Отговори (2)
Ако връщате буфер от естествен код, трябва да използвате Pointer
и да използвате различните методи за достъп до данни с указател, за да получите/зададете данни (Pointer.getByteArray()
и Pointer.setByteArray()
, например). Обърнете внимание, че ако данните са разпределени от собствен код, трябва да предоставите някакъв начин за изхвърляне на паметта, така че ще трябва или да запазите указателя в собствения код за по-късно изхвърляне, или да го предадете обратно от Java (като Pointer
) така че вашият C++ да може да извърши подходящата delete[]
операция.
Ако можете да разпределите буфера от страна на Java (препоръчва се, ако страната на Java трябва да манипулира широко данните), използвайте директно ByteBuffer
или Memory
, ако данните са дълготрайни, или примитивен байтов масив, ако собственият код трябва само да достъп до него за продължителността на естественото повикване.
Документацията на JNA ясно показва, че родният char
се преобразува в Java byte
.
Също така имайте предвид, че Java има само стойности със знак, така че ще трябва да конвертирате стойностите на Java byte
(които може да са отрицателни) в по-голям тип (short
или int
) и да маскирате горните битове, напр.
int data = (int)byteValue & 0xFF;
Моля, опитайте да използвате Pointer.getCharArray(long offset,int arraySize)
метод на указателя клас.
Предполагам, че това, което отпечатвате, е произволно място в паметта на указател, преобразуван в низ чрез кодиране по подразбиране.
char
данни.
- person technomage; 21.05.2012
byte[]
от стойността на указателя иNative.toString(byte[] data, String encoding)
. - person technomage   schedule 18.05.2012Pointer.getByteArray(0, 260)
и отпечатайте резултатите в шестнадесетичен. Това ще ви покаже действителното съдържание на паметта и ако съдържа четимо за човека съдържание, ще видите шестнадесетични стойности в ASCII диапазона (0x40-0x7F или така). JNA ще може да извлече правилните данни само когато знаете размера и формата на основните данни (което очевидно не знаете, тъй катоPointer.getString(0)
не дава очаквания резултат). - person technomage   schedule 18.05.2012byte[]
като параметър в JNA, C++ кодът може да пише в резултантния буфер и повикващият ще види резултата. Ако естественият код наистина връща правилно прекратен с NUL C низ, тогава можете да използвате String като тип на връщане. Ако нищо от това не работи, тогава форматът на вашия низ не е C низ с нулев край и трябва да прегледате съдържанието на паметта, както е описано по-горе, за да определите с какъв формат имате работа. - person technomage   schedule 19.05.2012