在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使用名为libc
的glibc
的淡化版本。 它具有与大多数常用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的实例,并从每行的开头删除./。