android开发分享在Android ndk / jni中使用C ++

所有的ndk样本只使用头文件中声明为extern的基本C函数,并在cpp文件中定义。 然后在包含jnicallback的C文件中包含头文件后,一切正常。

有没有可能使用android ndk的C + +类? 我的应用程序不会是一个本地的活动,它仍然有一个重要的Java部分,但它会调用CPU密集型计算的本地C代码(已经用C ++编写,有类和其他C ++的东西)。

这里是我的你好,像现在strcuture世界:

文件“first.h”

#ifndef FIRST_H #define FIRST_H class Test {}; #endif /* FIRST_H */ 

文件“second.cpp”

 #include <jni.h> #include "first.h" #ifdef __cplusplus extern "C" { #endif jint Java_com_example_twolibs_TwoLibs_add( JNIEnv* env, jobject this, jint x, jint y ) { Test t; return 0; } #ifdef __cplusplus } #endif 

最后是Android.mk

 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libtwolib-second LOCAL_SRC_FILES := second.cpp include $(BUILD_SHARED_LIBRARY) 

很基本,但不能编译。 在.c文件中joinsecond.cpp会引发包含头文件的错误,我想这是因为它不是C ++文件。

 error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Test' 

使它.cpp引发以下错误:

 make: *** No rule to make target `/cygdrive/c/android-ndk-r5c/samples/twolibs/jni/second.c', needed by `/cygdrive/c/android-ndk-r5c/samples/two-libs/obj/local/armeabi/objs/twolib-second/second.o'. Stop. 

任何想法如何使这个东西编译?

谢谢

    您可以将NDK与C ++一起使用,但使用C ++代码的文件必须具有.cpp扩展名。

    来自ANDROID-MK.html

    请注意,C ++源文件的默认扩展名是'.cpp'。 然而,通过定义variablesLOCAL_CPP_EXTENSION可以指定一个不同的值。 不要忘记最初的点(即'.cxx'将起作用,但不会'cxx')。

    您将不得不重新编译所有专用于Android的本机库。 您确实需要所有您计划使用的第三方本机库的源代码,因为通常当我们在Android之外编译和链接这些库时,它们与glibc链接,但不幸的是Android由于显示和性能问题而不使用glibc 。 Android使用名为libcglibc的淡化版本。 它具有与大多数常用functionglibc匹配的符号名称。 但据我所知,libc没有与strings相关的一些function,而且它肯定没有一些posix支持。 如果您的本地库正在使用任何已弃用的function,则必须使用libc支持的其他function并相应地编码您的库来为这些库find解决方法。

    另外,正如你指出的,你将不得不使用NDK来将Java(Android app / fwk)连接到本地(C ++)。

    虽然这听起来很简单,但根据我的经验,在Android(Android移植)上编译本地库时,传统上非常耗时,并不保证成功。

    关于你的编译错误,好像你先把它叫做“second.c”,后来改名为“second.cpp”,但是目标文件中仍然有“second.c”的名字,所以在编译之前(bdk-build)您需要删除/ cygdrive / c / android-ndk-r5c / samples / two-libs / obj / local / armeabi / objs / twolib-second /目录中的* .o和* .d文件

    错误:在'class'之前期望'=',',',';','asm'或'__ attribute __'

    经典案例缺less';' 之前的类关键字? 想像

      int functionname(int p) class X { } ; 

    这可能会导致您的编译器消息很容易。 一个常见的复杂因素是它实际上是什么样的

      #include "someheader.h" class X { } ; 

    并且错误是在someheader.h /里面的最后一个声明中或者recursion包含的文件/中)

    跑:

     ndk-build clean 

    在修改了一个错误的Android.mk后,即使修改了configuration,构build也可能会继续失败。

    我认为这是OP 对这个评论意味着什么。

    编辑Android.mk

    修改LOCAL_SRC_FILES的实例,并从每行的开头删除./。

    以上就是android开发分享在Android ndk / jni中使用C ++相关内容,想了解更多android开发(异常处理)及android游戏开发关注计算机技术网(www.ctvol.com)!)。

      www.ctvol.com true Article android开发分享在Android ndk / jni中使用C ++

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/addevelopment/512388.html

      (0)
      上一篇 2020年11月27日 上午5:22
      下一篇 2020年11月27日 上午5:26

      精彩推荐