use*_*189 34 c c++ java-native-interface android android-ndk
所有ndk示例仅使用在标头中声明为extern并在cpp文件中定义的基本C函数.然后将头文件包含在包含jni回调的C文件中后,一切正常.
可以在android ndk中使用C++类吗?我的应用程序不会是本机活动,它仍然会有一个重要的Java部分,但它会调用本机C代码进行CPU密集型计算(已经用C++编写,包含类和其他C++东西).
现在这是我的hello-world,就像strcuture:
文件"first.h"
#ifndef FIRST_H
#define FIRST_H
class Test
{};
#endif /* FIRST_H */
Run Code Online (Sandbox Code Playgroud)
档案"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
Run Code Online (Sandbox Code Playgroud)
最后是Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libtwolib-second
LOCAL_SRC_FILES := second.cpp
include $(BUILD_SHARED_LIBRARY)
Run Code Online (Sandbox Code Playgroud)
非常基本,但不编译.在包含头文件时,转换.c文件中的second.cpp会引发错误,我想这是因为它不是C++文件.
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Test'
Run Code Online (Sandbox Code Playgroud)
使它.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.
Run Code Online (Sandbox Code Playgroud)
知道如何编译那个东西吗?
谢谢
Mic*_*ael 15
您可以将C++与NDK一起使用,但具有C++代码的文件必须具有.cpp扩展名.
来自ANDROID-MK.html:
请注意,C++源文件的默认扩展名为".cpp".但是,可以通过定义变量LOCAL_CPP_EXTENSION来指定不同的一个.不要忘记初始点(即'.cxx'将起作用,但不能'cxx').