根据我的经验,我会使用 android java 入口点,否则你很可能会遇到问题(你可以制作完整的原生 android 应用程序,但我强烈建议不要这样做)。
其中一个原因是您希望从 CPP 内部调用 SDK 函数,并且从 CPP 对 java 环境使用反射并非易事。
步骤如下:
- 创建一个非常简单的 C 代码,作为 CPP 代码的桥梁。以下是我常用的一些示例 C 函数:
- OnApplicationStart
- OnApplicationPaused
- OnApplicationResumed
- OnApplicationUpdate
- OnTouchReceived
- 导出这些函数并将它们加载到您的 Java 代码中(查找 JNI 以了解如何执行此操作)
- 在 Java 中处理所有 Android 特定操作,以及在 cpp 中处理所有应用程序特定操作
所以第一个问题的答案是 java 包装器不是强制性的,但强烈推荐。
回答你的第二个问题:
是的,您可以使用 cmkae、ant、cygwin 等各种命令工具来创建您的 apk(取决于您自己的感觉如何)。您仍然会使用 android 编译器,因为您的目标是 arm。
不同之处在于您需要在 manifest.xml 中将应用程序的入口点从普通活动更改为原生活动 (http://developer.android.com/reference/android/app/NativeActivity.html)。
如您所见,区别不在于构建系统,而在于您定义入口点的方式。
作为一个友好的建议,请尝试使用最小的 java 包装方法。您可能会更快地获得更好的结果,并且不会花费您超过 1 周的时间在网上研究如何将 java 代码链接到 cpp。
编辑:
根据需要,我将简要说明我将如何处理将 CPP 应用程序移植到 Android 的过程:
- 重新考虑将您的应用程序用作共享库,使用 C 入口点:
a.创建一个简单的 C 应用程序,该应用程序将加载 yourCPPApp.dll(如果您使用的是 linux,则为 .so)
b.在您的 .dll 中创建要导出的最少必要的 extern "C" 函数,以便为您的 dll 提供必要的信息
为简单起见,我们假设我们有 3 个方法:
void StartApplication();
bool OnApplicationUpdate();
void OnScreenTouched(int x, int y);
c。实现简单的 C 项目,该项目将在外部调用这些方法(因此 .exe 将从 .dll 调用方法!)
示例代码:
#include "myCPPapp.h"
int main(int arg, char** argv)
{
StartApplication();
srand(time(NULL));
while (OnApplicationUpdate())
{
// we assume we have a 480x640 resolution
OnScreenTouched(rand()%480,rand()%640);
}
return 0;
}
- 现在我们已经有了使用 .exe 和 .dll 完全本地运行的东西,是时候让它使用 .apk 和 .so 了
一个。将暴露的方法从 myCppApp 重命名为 java 兼容的原型
extern "C" {
JNIEXPORT void JNICALL Java_com_sample_nativebridge_OnApplicationStart(JNIEnv env, jobject thiz);
JNIEXPORT jboolean JNICALL Java_com_sample_nativebridge_OnApplcationUpdate(JNIEnv env, jobject thiz);
JNIEXPORT void JNICALL Java_com_sample_nativebridge_OnScreenTouched(JNIEnv env, jobject thiz, jint x, jint y);
}
b.在 com.sample 包中创建 java 类 nativebridge(区分大小写)(您需要尊重名称才能正确链接到本机)
class nativebridge {
public static native void OnApplicationStart();
public static native boolean OnApplicationUpdate();
public static native void OnScreenTouched(int x, int y);
}
c。在本机桥中添加加载库语句,以便在运行时加载您的库
class nativebridge {
....
static {
System.loadLibrary("myCppApp");
// notice that the lib prefix and .so sufix aren't part of the name
}
}
d。使用 armeabi 编译器编译您的 CPP 代码并创建 libmyCPPApp.so(ndk 构建系统,或任何您想要的...我会使用 ndk,这很容易,只需进入带有 Android.mk 的文件夹并调用 $ ANDROID_NDK_BUILD_PATH/build)
此时您需要创建一个 .mk 文件来编译您的 myCppApp 代码,但这超出了范围,您需要自己进行这项研究(一旦掌握了它,这将非常简单)。
c。在您认为合适的任何地方使用 Java 应用程序内部桥接器中的本机方法。
一个很好的提示是通过 ndk 的 hello world 示例:
http://www.ntu.edu.sg/home/ehchua/programming/android/android_ndk.html
享受吧。