【发布时间】:2012-05-13 12:28:18
【问题描述】:
我有一个依赖于Effect.h 文件的Ability.h 文件。
我需要使用 javah 来生成我的标头,但我无法在我想要的 Ability.java 类中定义 Effect 依赖项生成的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)。
如何在 javah 生成 *.h 的 Xyz.java 类中直接包含另一个 c++ 文件?
编辑:这个问题也可以这样问:有没有办法传递 C++ 类型的参数或从作为 C++ 和 Java 之间接口的函数返回 C++ 类型的值? (接口媒介是 JNI。)例如,您可以使用 int 等基本类型,然后将其转换为 jint 等。
【问题讨论】:
-
“不包括 com_test_Effect”。那部分没有任何作用。你在这里没有“包含”任何东西,你是在运行时加载库。它对 Java 编译器或
javah没有任何神奇的作用。请问你编译Effect类了吗? -
@EJP 是的,Effect 已编译,但这只是因为它不依赖任何东西。我想知道如何在 Xyz.java 中使用 c++ 类型,以便 javah 可以生成正确的 *.h 文件。
-
@EJP 假设我不想在那里使用“效果”,而是使用 std::string。鉴于启用了 stl,我仍然无法包含标题。好吧,我可以在 *.cpp 文件中执行此操作,但不能在 c++ 标头中执行此操作。
-
您只能返回或传递给 JNI 函数的 Java 类型(jint、jstring、jobject 等)。不是 C 类型(指针/结构),也不是 C++ 类型(std::strings)。你能告诉我们你的头文件吗?
标签: java android c++ android-ndk javah