Как да върна char * aarr= new char[200] от C++ към Java с помощта на JNA

Аз съм нов в JNA. в моето едно приложение трябва да върна char * aarr= new char[200] на java от c. Не мога да разбера как да направя това. Какъв трябва да бъде типът връщане на моята c++ функция? И как трябва да декларирам моя java метод, за да съживя масива char? Има ли някакъв друг начин като предаване на променлива по референция в c++, за да получите стойността на char[] на c++?


person Jony    schedule 18.05.2012    source източник
comment
Уверете се, че вашата върната стойност е наистина NUL прекратен C низ и че е ASCII кодиран. Ако низът е UTF8 или друго кодиране, ще трябва да посочите кодирането (извлечете byte[] от стойността на указателя и Native.toString(byte[] data, String encoding).   -  person technomage    schedule 18.05.2012
comment
@BhavikAmbani по различен начин от връзката, която току-що сте поставили, това е за JNA, а вашият е за JNI   -  person Jony    schedule 18.05.2012
comment
Ако приемем, че върнатият указател наистина сочи към буфер от 260 символа (а не LPTCHAR или нещо подобно), извлечете данните с Pointer.getByteArray(0, 260) и отпечатайте резултатите в шестнадесетичен. Това ще ви покаже действителното съдържание на паметта и ако съдържа четимо за човека съдържание, ще видите шестнадесетични стойности в ASCII диапазона (0x40-0x7F или така). JNA ще може да извлече правилните данни само когато знаете размера и формата на основните данни (което очевидно не знаете, тъй като Pointer.getString(0) не дава очаквания резултат).   -  person technomage    schedule 18.05.2012
comment
@technomage редактирах въпроса си, моля, прочетете, кажете ми как да картографирам тези неща в java?   -  person Jony    schedule 19.05.2012
comment
Моля, прочетете коментара ми по-горе.   -  person technomage    schedule 19.05.2012
comment
Ако подадете byte[] като параметър в JNA, C++ кодът може да пише в резултантния буфер и повикващият ще види резултата. Ако естественият код наистина връща правилно прекратен с NUL C низ, тогава можете да използвате String като тип на връщане. Ако нищо от това не работи, тогава форматът на вашия низ не е C низ с нулев край и трябва да прегледате съдържанието на паметта, както е описано по-горе, за да определите с какъв формат имате работа.   -  person technomage    schedule 19.05.2012
comment
@technomage, позволете ми да изясня, че char * aarr= нов char[3318000]. който получава данни за изображение в сива скала. Сега искам по някакъв начин да върна този aarr в java да получа това изображение в java, за да обработя допълнително изображението, тъй като разработвам приложение за обработка на рентгенови изображения. Така че сега, моля, насочете ме какво да правя?   -  person Jony    schedule 19.05.2012


Отговори (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;

person technomage    schedule 21.05.2012

Моля, опитайте да използвате Pointer.getCharArray(long offset,int arraySize) метод на указателя клас.

Предполагам, че това, което отпечатвате, е произволно място в паметта на указател, преобразуван в низ чрез кодиране по подразбиране.

person Santosh    schedule 18.05.2012
comment
getCharArray() определено е погрешното нещо, което трябва да направите за всякакви char данни. - person technomage; 21.05.2012