Как изменить значение jstring, передаваемой в подпрограмму C ++, используя Java и JNI? - PullRequest
3 голосов
/ 09 сентября 2011

Могу ли я передать строку из Java в мою подпрограмму C ++, используя вызовы функций JNI, и изменить ее значение в подпрограмме C ++?

До сих пор я видел примеры возврата jstring, чего я не хочу делать. Другой вариант, о котором я знаю, - это получить идентификатор строковой переменной в C ++ и установить ее значение.

В настоящее время я играю с функцией, подобной следующей:

JNIEXPORT void JNICALL Java_myexample_ChangeString
(JNIEnv *, jobject obj, jstring strJava) 

И я хочу изменить значение strJava. Итак, по сути, я спрашиваю, может ли Java передавать переменные по ссылке, а не только по значению.

Спасибо.

Ответы [ 2 ]

6 голосов
/ 09 сентября 2011

Java-строки по своей конструкции неизменны, их нельзя изменить даже с помощью JNI.

2 голосов
/ 09 сентября 2011

Итак, похоже, что вы действительно хотите вернуть несколько значений из нативного метода.Нет прямого способа сделать это, но есть несколько косвенных способов:

  • Вместо того, чтобы возвращать boolean, создайте класс, который содержит и boolean, и String,и ваш нативный код создает и возвращает экземпляр этого класса.
  • Передает одноэлементный String[] в качестве аргумента, а нативный код устанавливает свой строковый результат в качестве первого элемента этого массива.
  • Создайте класс с методом #setStringValue(String) и передайте его в ваш собственный метод, который затем вызовет этот метод для предоставления строкового результата.После завершения собственного вызова Java-код, создавший вспомогательный класс, может извлечь строковое значение.

Из этих возможностей одноэлементный массив, вероятно, проще всего обрабатывать из кода JNIпотому что это не включает поиск дополнительных классов или методов.Однако, если бы я хотел вернуть дополнительную информацию из не нативного метода, я бы, вероятно, возвратил экземпляр нового класса, содержащий оба результата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...