Передача указателя из Java в родной - PullRequest
4 голосов
/ 29 января 2009

Я делаю интерфейс к библиотеке DLL, чтобы я мог использовать его с Java. Мне нужна моя нативная функция для изменения значения параметра jlong. Вроде параметр был передан по ссылке. Мой Java-метод должен иметь точные параметры, как показано здесь в качестве встроенной функции MPUSBWrite.

Пример действующего неработающего кода: MPUSBWrite получает свой 4-й параметр в качестве ссылки и изменяет значение itrs. Я всегда получаю 0, когда читаю переданную переменную pLength.

Java:

public static native boolean Write(long handle, byte[] pData, int dwLen, long pLength, int dwMilliseconds);

Родной C ++:

JNIEXPORT jboolean JNICALL Java_jPicUsb_iface_Write
(JNIEnv *env, jclass jc, jlong handle, jbyteArray pData, jint dwLen, jlong pLength, jint dwMilliseconds) {
    jniByteArray b(env, pData);
    DWORD res = MPUSBWrite((HANDLE)handle,b.getBytes(),dwLen,(PDWORD)pLength,dwMilliseconds);
    if (res) {
        return JNI_TRUE;
    } else {
        return JNI_FALSE;
    }
}

Есть ли способ, которым мой код C ++ изменяет значение переменной pLength по ссылке?

Ответы [ 3 ]

2 голосов
/ 24 апреля 2009

SWIG поддерживает эту функцию.

С SWIG вы можете обновлять значения параметров Java, такие как указатели в C ++. Это работает для параметров объекта очень хорошо. Вы можете вставить объект Long, чтобы он заработал.

С Swig вы можете написать слой между java и C ++, где вы можете поместить значение указателя после вызова функции в объект Java. Swig также генерирует классы Java, вы должны вызывать функции C ++. Когда функция C ++ содержит другой класс C ++ в качестве параметра, Swig генерирует этот класс C ++ как объект Java с getter, setter и всеми функциями C ++, которые вы хотите вызвать.

Для этой функции в Swig есть специальный язык, который вы должны написать в проекте VisualStudio. но все это описано в Swig Manual

SWIG - это инструмент разработки программного обеспечения, который связывает программы, написанные на C и C ++, с различными языками программирования высокого уровня. SWIG используется с различными типами языков, включая распространенные языки сценариев, такие как Perl, PHP, Python, Tcl и Ruby. В список поддерживаемых языков входят также языки, не относящиеся к сценариям, такие как C #, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), Java, Lua, Modula-3, OCAML, Octave и R.

1 голос
/ 29 января 2009

номер

Наилучшим вариантом, если вам действительно необходимо это сделать, является определение четвертого параметра как long [], и ваш код JNI обновляет элемент массива.

На самом деле, ваш лучший вариант - подумать, почему вы не можете вернуть long из метода.

0 голосов
/ 24 апреля 2009

Это не проблема JNI. Функция вызывается по значению, ее нельзя изменить. Передайте объект или массив, чтобы вы могли получить ссылку.

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