将CPP应用程序移植到Android

岩浆刀

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

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

  2. 我见过有人声称他们能够操纵自己的cmake文件,并自定义一些习惯android-cmake toolchain来构建他们的项目,“.so”或者最终“.apk”从他们的项目中获得收益。没有java包装程序,是否有可能操纵cmakecpp项目文件来构建您的项目?(来源:使用Cmake构建Android NDK项目

迈克尔·CMS

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

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

步骤如下:

  1. 创建一个非常简单的C代码,它将作为您CPP代码的桥梁。以下是一些我常用的示例C函数:
    • OnApplicationStart
    • OnApplicationPaused
    • OnApplicationResumed
    • OnApplicationUpdate
    • OnTouch已接收
  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)

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;
 }
  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);
}

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将应用程序移植到android

来自分类Dev

将应用程序移植到android

来自分类Dev

将Android输入移植到Java桌面应用程序

来自分类Dev

是否可以将iOS应用程序移植到Android?

来自分类Dev

使用NDK将C ++应用程序移植到Android

来自分类Dev

将应用程序从Eclipse移植到Android Studio时出错

来自分类Dev

将Android应用程序移植到Xamarin或Windows本机问题

来自分类Dev

openFileOutput() , opernFileInput() 在 iOS 中等效(将 Android 应用程序移植到 iOS 平台)

来自分类Dev

将WinForms应用程序移植到Mac OS

来自分类Dev

将iPhone应用程序移植到iPad

来自分类Dev

将WinForms应用程序移植到Mac OS

来自分类Dev

将应用程序从Java移植到Python

来自分类Dev

将应用程序移植到Google App Engine

来自分类Dev

如何将SpringMVC应用程序移植到SpringREST?

来自分类Dev

将命令行应用程序移植到Sinatra / Ruby on Rails应用程序

来自分类Dev

将 Android 应用程序移植为 Web 应用程序

来自分类Dev

将OpenGL ES应用程序移植到本机OpenGL程序时如何处理EGL

来自分类Dev

如何将 C# WinForm 应用程序和安装程序移植到 MacOS?

来自分类Dev

使用使用JavaScript互操作导入的JavaScript库将React应用程序移植到Blazor应用程序

来自分类Dev

将Xamarin Windows 8应用程序移植到Windows 10 SDK

来自分类Dev

Swift是“将iOS应用程序移植到OSX”的解决方案吗?

来自分类Dev

将Rails 3.2应用程序移植到Ember.js的最佳方法是什么?

来自分类Dev

将现有的快速应用程序从12.04移植到12.10?

来自分类Dev

将Firefox OS应用程序移植到ubuntu touch容易吗?

来自分类Dev

有关将应用程序从.Net Framework移植到.Net Core的问题

来自分类Dev

将现有的快速应用程序从12.04移植到12.10?

来自分类Dev

如何将Tomcat 6应用程序从Windows XP移植到Linux?

来自分类Dev

Swift是“将iOS应用程序移植到OSX”的解决方案吗?

来自分类Dev

使用Wininet将Delphi 2010应用程序肥皂Web服务移植到Winhttp

Related 相关文章

  1. 1

    将应用程序移植到android

  2. 2

    将应用程序移植到android

  3. 3

    将Android输入移植到Java桌面应用程序

  4. 4

    是否可以将iOS应用程序移植到Android?

  5. 5

    使用NDK将C ++应用程序移植到Android

  6. 6

    将应用程序从Eclipse移植到Android Studio时出错

  7. 7

    将Android应用程序移植到Xamarin或Windows本机问题

  8. 8

    openFileOutput() , opernFileInput() 在 iOS 中等效(将 Android 应用程序移植到 iOS 平台)

  9. 9

    将WinForms应用程序移植到Mac OS

  10. 10

    将iPhone应用程序移植到iPad

  11. 11

    将WinForms应用程序移植到Mac OS

  12. 12

    将应用程序从Java移植到Python

  13. 13

    将应用程序移植到Google App Engine

  14. 14

    如何将SpringMVC应用程序移植到SpringREST?

  15. 15

    将命令行应用程序移植到Sinatra / Ruby on Rails应用程序

  16. 16

    将 Android 应用程序移植为 Web 应用程序

  17. 17

    将OpenGL ES应用程序移植到本机OpenGL程序时如何处理EGL

  18. 18

    如何将 C# WinForm 应用程序和安装程序移植到 MacOS?

  19. 19

    使用使用JavaScript互操作导入的JavaScript库将React应用程序移植到Blazor应用程序

  20. 20

    将Xamarin Windows 8应用程序移植到Windows 10 SDK

  21. 21

    Swift是“将iOS应用程序移植到OSX”的解决方案吗?

  22. 22

    将Rails 3.2应用程序移植到Ember.js的最佳方法是什么?

  23. 23

    将现有的快速应用程序从12.04移植到12.10?

  24. 24

    将Firefox OS应用程序移植到ubuntu touch容易吗?

  25. 25

    有关将应用程序从.Net Framework移植到.Net Core的问题

  26. 26

    将现有的快速应用程序从12.04移植到12.10?

  27. 27

    如何将Tomcat 6应用程序从Windows XP移植到Linux?

  28. 28

    Swift是“将iOS应用程序移植到OSX”的解决方案吗?

  29. 29

    使用Wininet将Delphi 2010应用程序肥皂Web服务移植到Winhttp

热门标签

归档