代码之家  ›  专栏  ›  技术社区  ›  ingh.am

Android NDK混乱

  •  2
  • ingh.am  · 技术社区  · 14 年前

    我最近一直在玩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样本应该如何工作。有人能给我指出正确的方向吗?

    谢谢

    4 回复  |  直到 14 年前
        1
  •  4
  •   Pandoro    14 年前

    我认为你的方式并不是错的,但是要知道,在java和C++之间传递数据是很耗时的。因此,我建议您在C/C++中编写大部分代码,如果不能避免,只需调用java的C/C++函数即可。例如,您需要为GUI传回数据。特别是当你在编程一个实时游戏时,我会避免在java和C/C++代码之间传递数据。所以仅仅改变所有的方法,然后在Java代码中调用它们并不是一个好主意。

    顺便说一下,如果你必须把一些东西从C/C++传递给java,我不会把它作为返回值传递,而是把目的地作为函数调用中的参数。

        2
  •  5
  •   Community Mr_and_Mrs_D    7 年前

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

    与某些观点(包括谷歌的观点)相反,NDK可以而且经常 用于将游戏移植到Android。事实上,我现在就是这么用的。java需要C++从java到C++的用户事件,需要java建立基本的GL上下文(NDK中没有EGL绑定),但是你可以用OpenGL做C++中的所有其他事情,一旦你的基本Java消息被传递给C++,你就可以(大部分)忽略Java。谢天谢地。:)

    你仍然需要和java对话,以获得你的文件:两个都需要经过java,所以你可能想要使用“反向JNI”,在那里你调用C++的java函数。也不难,到处都有例子。

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

        3
  •  1
  •   doron    14 年前

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

        4
  •  1
  •   Gamma Draconis    14 年前

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