繁体   English   中英

将C ++与Android ndk / jni一起使用

[英]Use C++ with Android ndk/jni

所有的ndk示例仅使用在标头中声明为extern并在cpp文件中定义的基本C函数。 然后,将头文件包含在包含jni回调的C文件中之后,一切正常。

android ndk是否可以使用C ++类? 我的应用程序不会成为本机活动,它将仍然具有重要的Java部分,但是它将调用本机C代码进行CPU密集型计算(已经用C ++编写,带有类和其他C ++东西)。

这是我现在的世界,就像弹幕一样:

文件“ 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文件中打开second.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.

知道如何将其编译吗?

谢谢

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

来自ANDROID-MK.html

请注意,C ++源文件的默认扩展名是“ .cpp”。 但是,可以通过定义变量LOCAL_CPP_EXTENSION来指定其他变量。 不要忘记初始点(即'.cxx'将起作用,但'cxx'将不起作用)。

您将必须重新编译所有专门用于Android的本机库。 您确实需要计划使用的所有第3方本机库的源代码,这仅是因为通常当我们在Android外部编译并链接这些库时,它们会链接到glibc但不幸的是,由于许可和性能问题,Android不使用glibc Android使用称为libcglibc精简版本。 对于大多数常用功能,它具有与glibc匹配的符号名称。 但是据我所知,libc没有与strings相关的某些功能,并且绝对没有posix支持。 如果您的本机库正在使用任何不推荐使用的功能,则必须使用libc支持的替代功能并相应地对您的库进行编码,以找到针对这些库的解决方法。

另外,正如您正确指出的那样,您将必须使用NDK将Java(Android app / fwk)与本机世界(C ++)接口。

尽管按照我的经验听起来很简单,但在Android上编译本机库(Android porting)传统上非常耗时,而且无法保证成功。

关于您的编译错误,似乎您首先将其命名为“ second.c”,然后将其重命名为“ second.cpp”,但是目标文件中仍然具有“ second.c”名称,因此在进行编译之前(bdk-build)您需要删除/ cygdrive / c / android-ndk-r5c / samples / two-libs / obj / local / armeabi / objs / twolib-second /目录中的* .o和* .d文件

跑:

ndk-build clean

修改错误的Android.mk ,否则即使您已修复配置,构建也可能继续失败。

我认为这就是OP 在此评论中的意思。

编辑Android.mk

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

错误:“类”之前应为“ =”,“,”,“;”,“ asm”或“ __属性__”

缺少“;”的经典案例 在class关键字之前? 想像

 int functionname(int p)
 class X { } ;

这可能很容易导致您的编译器消息。 一个常见的复杂因素是当它看起来像

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

错误是在someheader.h内的最后一个声明中/或任何递归包含的文件/;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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