【问题标题】:Android NDK ConfusionAndroid NDK 混淆
【发布时间】:2011-04-07 18:43:11
【问题描述】:

我最近一直在玩 NDK,发现许多在线可用的教程真的没有帮助。我一直在使用this tutorial,并且运行良好。

但是。这是正确使用 NDK 吗?我的意思是,如果我有一个游戏说有很多 C++ 类,我希望移植到 android。我是否必须手动将所有方法更改为:

JNIEXPORT jstring JNICALL Java_com_domain_ndk_NativeLib_hello
  (JNIEnv * env, jobject obj) {
        return (*env)->NewStringUTF(env, "Hello World!");
}

我看不出这是一种非常有效的移植代码的方法,而且我感觉我使用 NDK 是错误的。我也不知道 NDK 样本应该如何工作。谁能指出我正确的方向?

谢谢

【问题讨论】:

    标签: java c++ android eclipse macos


    【解决方案1】:

    您无需更改任何现有方法即可使用“自动绑定”JNI 格式。 Google NDK 示例中没有很好的示例,但 Google SDK 在内部使用了另一种 JNI 绑定方法:在 JNI 文档中搜索 RegisterNatives()。但即便如此,您实际上只需要为 Android SDK 需要与您的库对话的几个地方创建一个包装器:一般的用户输入/传感器、绘制回调,以及可能的“更新”回调。除此之外,您的应用程序的其余部分应保持不变,除非要构建它。

    为了简化事情,我建议您不要使用本机小部件;如果您将游戏完全保留在 OpenGL 中,则可以避免使用 Java,例如,将纹理绘制到屏幕上,至少如果您面向 1.6 和更新的设备,其中 NDK 具有针对 OpenGL 的本机绑定。

    与某些观点(包括 Google 的观点)相反,NDK 可以并且经常被用于将游戏移植到 Android。事实上,我现在就是这样使用它。您需要将用户事件从 Java 传递到 C++,并且需要让 Java 设置基本的 GL 上下文(NDK 中没有 EGL 绑定),但是您可以使用 OpenGL 在 C++ 中完成几乎所有其他事情,并且一旦您基本的 Java 消息被传递给 C++,你可以(大部分)忽略 Java。谢天谢地。 :)

    您仍然需要与 Java 对话以获取声音,并访问您的文件:两者都需要通过 Java,因此您可能希望使用“反向 JNI”,您可以在其中调用 Java来自 C++ 的函数。也不难,而且到处都有例子。

    我在这里详细讨论如何访问您的资产:File Operations in Android NDK

    祝你好运。

    【讨论】:

    • 嘿,谢谢你,我认为这里是一个死问题的重要信息! :) 我还没有过多地使用 NDK,但我会更新我如何使用它。
    【解决方案2】:

    我想说你的方法没有错,但请注意,在 Java 和 C/C++ 代码之间传递数据是一件耗时的事情。因此,我建议您实际上用 C/C++ 编写大部分代码,如果无法避免,只需从 Java 调用 C/C++ 函数。例如,您需要为 GUI 传回数据。尤其是当您编写实时游戏时,我会避免在 Java 和 C/C++ 代码之间过多地传递数据。所以仅仅改变所有的方法然后在你的Java代码中调用它们并不是一个好主意。

    顺便说一句,如果您必须将某些内容从 C/C++ 传递回 Java,我不会将其作为返回值传递,而是将目标作为函数调用中的参数。

    【讨论】:

    • 我在桌面上用 C++ 编写了我的游戏,我可以在 iPhone 上运行几乎没有任何变化(除了一些调整和纹理加载和声音的东西),所以我可以使用它JNI 中的代码让它在 Android 上运行,对吗?如果它很耗时,这是唯一的方法。比重新编写整个游戏要好得多。
    • 嗯,我会说是的,这是可能的。但这确实取决于您的应用程序是否需要快速。一个简单的益智游戏?当然!但是,如果您谈论的是具有复杂图形的游戏,我真的会考虑编写新代码来调整结构,使其更适合 Android。
    【解决方案3】:

    NDK 只是 Android 的原生 C 和 C++ 开发环境。仿生(libc 的 Android 版本)受到的限制更小一些。唯一真正复杂的是将您的新组件集成到 Android 构建工具链中。 Android 有一个高度定制的 Makefile 系统。下载源代码并查看简单的原生组件应该会让您了解如何使用它。

    现在,如果您想将 Java 与 C 或 C++ 集成,您将需要了解 Java 本地接口 (JNI)。你应该可以在网上找到很好的 JNI 文档。

    【讨论】:

    • 那么这是正确的使用方法吗?对运行 NDK 示例有任何提示吗?
    【解决方案4】:

    新版本的 ndk (r5) 现在包括完全用本机代码编写应用程序的功能。

    【讨论】:

    • 今天早上我在看这个。一定要去看看!
    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 2021-03-23
    • 2011-03-31
    • 2011-12-08
    相关资源
    最近更新 更多