【问题标题】:Android NDK - Include a c++ header in a different header?Android NDK - 在不同的标头中包含 C++ 标头?
【发布时间】: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 生成 *.hXyz.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


【解决方案1】:

返回一个对象怎么样:

private native Object fooNative(Object x);

然后对其进行转换,使其具有相同的签名:

public Effect foo(Effect x) {
    return (Effect)fooNative(x);
}

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2020-03-21
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多