2012-05-13 5 views
4

У меня есть файл Ability.h, который зависит от файла Effect.h.Android NDK - Включить заголовок C++ в другой заголовок?

мне нужно использовать javah генерировать свой заголовок, но я не в состоянии определить зависимость эффекта в моем 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).

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

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

+0

"не включают в com_test_Effect". Эта часть этого не имеет никакого эффекта. Вы здесь не «включаете», вы загружаете библиотеки во время выполнения. Он не имеет магического эффекта для компилятора Java или 'javah'. Я бы спросил, собрал ли вы класс «Эффект»? – EJP

+0

@EJP Да, эффект скомпилирован, но только потому, что он ничем не зависит. Интересно, как использовать C++-типы в Xyz.java, чтобы затем javah мог сгенерировать правильный * .h-файл. – ScarletAmaranth

+0

@EJP Предположим, я не хочу использовать «Эффект» там, но std :: string. Учитывая, что stl включен, я до сих пор не могу включить заголовок. Ну, я могу сделать это в файле * .cpp, но не в заголовке C++. – ScarletAmaranth

ответ

-1

Что о возвращении объекта:

private native Object fooNative(Object x); 

Затем преобразовать его так, что он имеет такую ​​же подпись:

public Effect foo(Effect x) { 
    return (Effect)fooNative(x); 
} 
Смежные вопросы