使用C++和Android ndk/jni

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').

  • 好了,你的解决方案实际上是正确的,但我忘了清理一些.o文件因此make仍然在寻找.c文件.一旦我清理了所有东西并运行了新的ndk-build,一切正常.谢谢! (4认同)