Android NDK – включить заголовок С++ в другой заголовок?

У меня есть файл Ability.h, который зависит от файла Effect.h.

Мне нужно использовать javah для создания моего заголовка, но я не могу определить зависимость Effect в моем классе Ability.java, из которого я хотел бы создать заголовок C++ .

Пример:

public class Ability {

  static {
    System.loadLibrary("com_test_Effect");
    System.loadLibrary("com_test_Ability");
  }

  public native Effect foo(Effect x);

}

Этот код создает файл *.h без функции foo(), как если бы он не мог ее распознать. Он создает правильный файл, если я поменяю тип возвращаемого значения на int и не включу com_test_Effect.

У меня есть оба модуля, определенные в файле Android.mk (com_test_Effect и com_test_Ability).

Как включить другой файл С++ непосредственно в класс Xyz.java, из которого *.h генерируется javah?

Изменить. Вопрос также можно задать следующим образом: есть ли способ передать аргументы типа С++ или вернуть значение типа С++ из функции, которая является интерфейсом между С++ и Java? (Интерфейсной средой является JNI.) Например, вы можете сделать это с базовыми типами, такими как int, которые затем преобразуются в jint и так далее.


person ScarletAmaranth    schedule 13.05.2012    source источник
comment
не включайте com_test_Effect. Эта часть не имеет никакого эффекта. Вы ничего здесь не включаете, вы загружаете библиотеки во время выполнения. Это не оказывает волшебного эффекта на компилятор Java или javah. Я бы спросил, скомпилировали ли вы класс Effect?   -  person user207421    schedule 13.05.2012
comment
@EJP Да, Эффект скомпилирован, но только потому, что он ни от чего не зависит. Интересно, как использовать типы С++ в Xyz.java, чтобы javah мог генерировать правильный файл *.h.   -  person ScarletAmaranth    schedule 13.05.2012
comment
@EJP Предположим, я не хочу использовать там Effect, но std::string. Учитывая, что stl включен, я все еще не могу включить заголовок. Ну, я могу сделать это в файле *.cpp, но не в заголовке c++.   -  person ScarletAmaranth    schedule 13.05.2012
comment
Вы можете вернуть или передать функции JNI только типы Java (jint, jstring, jobject,... и т.д.). Не типы C (указатели/структуры) и не типы C++ (std::strings). Можете ли вы показать нам ваши заголовочные файлы?   -  person Mārtiņš Možeiko    schedule 13.05.2012


Ответы (1)


Как насчет возврата объекта:

private native Object fooNative(Object x);

Затем преобразуйте его так, чтобы он имел ту же подпись:

public Effect foo(Effect x) {
    return (Effect)fooNative(x);
}
person JonnyBoy    schedule 14.05.2012