2015-02-17 3 views
0

У меня есть следующая функция C:ЮНА: Указатель на символ **

int fillWithNames(const char*** names, int *n); 

который я конвертировать в Java, используя ЮНУ исходя, как это:

public interface PlayersLibrary extends Library { 
     PlayersLibrary INSTANCE = (PlayersLibrary) Native.loadLibrary("player", PlayersLibrary.class); 

int fillWithNames(PointerByReference names, IntByReference n); 

} 

Как я могу напечатать Струны, что это метод возвращается в names?

Я хочу сделать что-то вроде этого:

PlayersLibrary.INSTANCE.fillWithNames(names, n); 

Pointer first = names.getValue(); // char** 
String a = first.getPointer(0).getValue() // char* 
System.out.println(a); 

, но в этом случае names.getValue() возвращает нуль, и я не знаю, что делать

Что я могу сделать, чтобы решить эту проблему?

+2

Прежде чем писать одну строку Java, вы могли заставить свою функцию работать, вызывая ее из C++? или C? Я прошу об этом, так как программирование «тройной звезды» подвержено ошибкам, не говоря уже о попытке связать Java с такой штукой. – PaulMcKenzie

+0

Здравствуйте @PaulMcKenzie, да, я проверил, что функция работает на C++. Это унаследованная библиотека, у меня есть – broga

+0

. Если вы возвращаете значение «null» из 'Pointer.getValue()', это означает, что вызываемый пользователь никогда не писал в пространство, которое вы ему дали. Возможно, вы должны были дать ему адрес целого для параметра 'n', чтобы он мог рассказать вам, сколько его заполнило? Включите код, который инициализирует 'names' и' n'. – technomage

ответ

0

Class PointerByReference

Представляет ссылку на указатель на нативные данные. В обозначениях С, void**.

Также см. SO: PointerByReference not returning value.

+0

Я проверил множество источников информации перед публикацией, спасибо за вашу помощь, но такие ответы не помогают. Покажите мне код – broga

0

Использование names.getValue().getStringArray(0, n.getValue()]).

Я выводя, что параметр n говорит вызываемый, сколько имен для заполнения getStringArray() преобразуют последовательные значения указателей в памяти в строки до тех пор, пока не встретится значение NULL. если ваш собеседник не заканчивается указателем NULL, вам нужно явно указать ему, сколько указателей читать (якобы параметр n при вызове fillWithNames()).

EDIT

Так длина действительно вернется в параметре n. Если вызываемый оператор записывает нуль в этот параметр, то он говорит вам, что у него нет имен (по какой причине вы получите null в другом параметре).

+0

Здравствуйте, нет, функция записывает оба параметра. И имена - это указатель на const char **, поэтому память немного беспорядочна, потому что она не последовательна, как в char [] [] – broga

+0

Является ли это 'const char **' или 'const char *** '? Большая разница. Я предполагаю, что вызывающая запись записывает 'const char **' в память, в которую вы проходите. Вы получаете это значение, вызывая 'PointerByReference.getValue()', после чего вы сможете извлечь массив строк (при условии, что возвращаемый указатель не 'null'). – technomage

+0

Это const char ***, см. Выше. Да, вы делаете вывод очень хорошо. Функция, которую я вызываю, выделяет некоторую память, записывает строки и количество строк, которые она написала. Пример кода C: 'const ** char test; fillWithNames (& test, &n); ' – broga

Смежные вопросы