所有的ndk示例都只使用在头文件中声明为extern并在cpp文件中定义的基本C函数。然后,在包含jni回调的C文件中包含头文件后,一切都可以正常工作。
是否可能在android ndk中使用C++类?我的应用程序不会成为本地活动,它仍将有一个重要的java部分,但它将调用本机C代码进行CPU密集型计算(已经用C++编写,具有类和其他C++内容)。
这是我现在的类似于hello-world的结构:
文件“first.h”
将其更改为.cpp会引发以下错误:
有什么办法可以让这个东西编译吗?
谢谢。
是否可能在android ndk中使用C++类?我的应用程序不会成为本地活动,它仍将有一个重要的java部分,但它将调用本机C代码进行CPU密集型计算(已经用C++编写,具有类和其他C++内容)。
这是我现在的类似于hello-world的结构:
文件“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)
这很基础,但是无法编译。将second.cpp转换成.c文件会在包含头文件时引发错误,我猜这是因为它不是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.
有什么办法可以让这个东西编译吗?
谢谢。