繁体   English   中英

将CPP应用程序移植到Android

[英]Porting a CPP application to Android

我需要将CPP项目移植到Android但是由于以下不确定的原因,我被卡住了:

  1. 我的CPP项目是否需要使用某种Java包装器,即是否一定要使用Android SDK将应用程序与Android集成? 如果还有另一种方法,那将是哪一种?

  2. 我见过有人声称他们已经能够操纵自己的cmake文件和一些自定义的android-cmake toolchain来从其项目中构建其“.so”或最终成为“.apk” 如果没有java包装器,是否有可能操纵cpp项目的cmake文件来构建您的项目? (来源: 使用Cmake构建Android NDK项目

根据我的经验,我会使用android java入口点,否则您很可能会遇到麻烦(您可以制作完整的本机android应用程序,但我强烈建议您这样做)。

原因之一是您希望从CPP内部调用SDK函数,并且在CPP上对Java环境进行反射并不是一件容易的事。

步骤如下:

  1. 创建一个非常简单的C代码,它将作为您CPP代码的桥梁。 这是我常用的一些示例C函数:
    • OnApplicationStart
    • OnApplicationPaused
    • OnApplicationResumed
    • OnApplicationUpdate
    • OnTouchReceived
  2. 导出这些函数并将其加载到您的Java代码中(有关如何执行此操作的查找JNI)
  3. 处理Java中所有Android特定操作,以及cpp中所有应用特定操作

因此,第一个问题的答案是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的过程:

  1. 使用C入口点重新考虑将应用程序用作共享库:

创建一个简单的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;
 }
  1. 现在,我们已经可以使用.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);
}

在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM