JNA Pass char * По ссылке - PullRequest
       280

JNA Pass char * По ссылке

2 голосов
/ 02 марта 2012
DllExport void LoadString(char *myStr)
{
    cout << "Before: " << myStr << endl;
    LoadStringData(&myStr);
    cout << "After:" << myStr << endl;
}

и это в Java:

Pointer myStr = new Memory(Pointer.SIZE);
System.out.println(String.format("myStr Value: %s", myStr.getPointer(0).getString(0)));
this.Lib.LoadString(myStr);
System.out.println(String.format("myStr Value: %s", myStr.getPointer(0).getString(0)));

И это вывод:

myStr Value: ¸ï1
Before: Øî1
After:test
myStr Value: ¸ï1

Итак, я ясно вижу, как передается указатель мусора, перераспределенный на C ++ (после: test), но по какой-то причине JNA не знает об этом изменении.

Эти темы говорят о том, что я делаю правильно:

Как получить новый указатель на Java?

Отображение структуры и указателя JNA

И я также попробовал PointerByReference (хотя, честно говоря, это действует как void **), но я выбрасываю каждую идею, которую я могу достичь. Однако вышеприведенные темы касаются прохождения структур, а не char *, но я не понимаю, почему JNA будет заботиться о разнице здесь.

Есть идеи?

1 Ответ

1 голос
/ 03 марта 2012
DllExport void LoadString(char **myStr)
{
    cout << "Before: " << *myStr << endl;
    LoadStringData(myStr);
    cout << "After:" << *myStr << endl;
}

Должно работать лучше, чтобы передать ссылку на память (символ *), а не на саму память (символ ), чтобы ваши изменения вернулись в Java.

...