Возврат класса C++ к Java через JNI

Я не парень Unix, но я думаю, что можно использовать

gawk '{print strftime("%d/%m/%y",systime()) $0 }' < somefile.txt
14
задан tomzx 10 November 2009 в 21:51
поделиться

3 ответа

Вот решение, которое я решил использовать:

Во-первых, я бы создал аналогичный объект на Java. Затем из C ++ я создавал его экземпляр и передавал ему все значения.

(C++)
clazz = env->FindClass("java/lang/Integer");
jmethodID method = env->GetMethodID(clazz, "<init>", "(I)V");
return env->NewObject(clazz, method, (jint)anInteger);

Но потом я понял, что это не очень переносимо и было немного слишком сложно.

Вместо этого я решил вернуть строку, которую Java будет анализировать и используйте для инициализации объекта на своей стороне.

(JAVA)
String aString = "valuesoftheobject";
MyObject myObject(aString);

MyObject будет иметь конструктор, который принимает строку. Я считаю, что решение простое и эффективное.

11
ответ дан 1 December 2019 в 13:09
поделиться

Если ваш класс MyObject определен на C ++, вы не сможете получить доступ к его методам в Java. Я бы попытался определить класс-оболочку Java вокруг вашего объекта C:

Java:
public C_Object() {
   handle = createHandle();
}

private native long createHandle(); // or whatever pointer/handle type?

public void doStuff() {
   _doStuff(handle);
}

private native void _doStuff(long handle);

Если вместо этого вы можете экстраполировать C api, вы можете попробовать JNA .

UnsatisfiedLinkError может быть дополнительным символом в вашем имя функции, как написано выше, или, возможно, она не может обработать возвращаемое значение MyObject ?

4
ответ дан 1 December 2019 в 13:09
поделиться

Еще один инструмент, на который вам следует обратить внимание, это SWIG . SWIG - отличный инструмент для создания оболочек на других языках (например, Java, Python или C #) для существующих объектов C / C ++. Он будет генерировать автоматические оболочки Java вокруг объектов C / C ++ и выполнять всю тяжелую работу JNI за вас.

Я широко использую его в Xuggler . Чтобы увидеть пример, если вы загружаете исходный код Xuggler, здесь есть объект C ++:

csrc/com/xuggle/xuggler/IStreamCoder.h

Я определяю файл интерфейса SWIG здесь:

csrc/com/xuggle/xuggler/IStreamCoder.i

И при запуске через Swig он генерирует объект Java (который хранится здесь)

generate/java/com/xuggle/xuggler/IStreamCoder.java

Затем мы можем легко получить доступ к этому объекту из Java (ну, я добавил кое-что для подсчета ссылок, но это довольно сложно). Надеюсь, что это поможет.

Art

5
ответ дан 1 December 2019 в 13:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: