我需要将一个CPP
项目移植到其中,Android
但是由于以下不确定的原因,我被卡住了:
我是否需要为我的CPP
项目使用某种Java包装器,即是否必须使用Android SDK
我的应用程序与之集成Android
?如果还有另一种方法,那将是哪一种?
我见过有人声称他们能够操纵自己的cmake文件,并自定义一些习惯android-cmake toolchain
来构建他们的项目,“.so”
或者最终“.apk”
从他们的项目中获得收益。没有java
包装程序,是否有可能操纵cmake
cpp项目的文件来构建您的项目?(来源:使用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)
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;
}
一种。将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(区分大小写)(您无需尊重名称即可正确链接到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
请享用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句