[英]Porting a CPP application to Android
我需要将CPP
项目移植到Android
但是由于以下不确定的原因,我被卡住了:
我的CPP
项目是否需要使用某种Java包装器,即是否一定要使用Android SDK
将应用程序与Android
集成? 如果还有另一种方法,那将是哪一种?
我见过有人声称他们已经能够操纵自己的cmake文件和一些自定义的android-cmake toolchain
来从其项目中构建其“.so”
或最终成为“.apk”
。 如果没有java
包装器,是否有可能操纵cpp项目的cmake
文件来构建您的项目? (来源: 使用Cmake构建Android NDK项目 )
根据我的经验,我会使用android java入口点,否则您很可能会遇到麻烦(您可以制作完整的本机android应用程序,但我强烈建议您这样做)。
原因之一是您希望从CPP内部调用SDK函数,并且在CPP上对Java环境进行反射并不是一件容易的事。
步骤如下:
因此,第一个问题的答案是Java包装器不是必需的,但强烈建议使用。
要回答您的第二个问题:
是的,您可以使用cmkae,ant,cygwin,命令工具分配,这些命令工具最终将创建apk(取决于您的舒适程度)。由于您的目标是arm,因此您仍将使用android编译器。
区别在于,您需要在manifest.xml中将应用程序的入口点从正常活动更改为本地活动( http://developer.android.com/reference/android/app/NativeActivity.html )。
如您所见,差异不是构建系统,而是定义入口点的方式。
作为友好的建议,请尝试使用最少的Java包装器方法。 您可能会更快地获得更好的结果,并且在Web上花了不到1周的时间进行有关如何将Java代码链接到cpp的研究。
编辑:
根据需求,我将简要说明如何将CPP应用程序移植到Android的过程:
创建一个简单的C应用程序,该应用程序将加载yourCPPApp.dll(如果在Linux上则为.so)
湾 在您的.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;
}
一种。 将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);
}
湾 在com.sample包中创建java类nativebridge(区分大小写)(您无需尊重名称即可正确链接到native)
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的世界示例:
http://www.ntu.edu.sg/home/ehchua/programming/android/android_ndk.html
请享用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.