如何在 android studio 中创建 c++ class(.h 和 .cpp)?

How to create a c++ class (.h and .cpp) in android studio?

我正在学习使用 android NDK 并尝试创建原生 C++ class(.h 和 .cpp)。我按照官方教程(https://developer.android.com/studio/projects/add-native-code.html)来实现这一点。我设法创建了一个简单的 c++ class 并从 java 调用它,没问题。

现在我想创建我自己的 c++ class(假设是一个 HellowWorld class),只使用一个什么也不做的构造函数。为此,我右键单击我的 cpp 文件夹,其中包含我已经在工作的 JNI 包装器。

我创建了我的 class 并创建了一个默认构造函数并从我的 JNI 函数中调用它,但它在编译期间崩溃了:

Error:FAILURE: Build failed with an exception.

我认为 link 处理 .h 和 .cpp 文件时出现问题。当我尝试内联实现我的构造函数时,它工作正常。它只是找不到 .cpp 实现。

这是我的 JNI 本机-lib.cpp 文件:

#include <jni.h>
#include <string>
#include "HelloWorld.h"

extern "C"
jstring
Java_he_1arc_myapplication2_MainActivity_stringFromJNI(
JNIEnv *env,
jobject /* this */) {
HelloWorld t;
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}

这是我的 Helloworld.h:

#ifndef MYAPPLICATION2_HELLOWORLD_H
#define MYAPPLICATION2_HELLOWORLD_H


class HelloWorld {
public:
     HelloWorld();
};
#endif //MYAPPLICATION2_HELLOWORLD_H

这是我的 HelloWorld.cpp

#include "HelloWorld.h"
HelloWorld::HelloWorld() { }

当我打开这个文件时,android工作室告诉我"This file is not part of the project. Please include it in the appropriate build file (build.gradle, CMakeLists.txt or Android.mk etc.) and sync the project."

所以,我如何 link 这些可爱的 .h 和 .cpp 在一起?

public:
 HelloWorld();

至少应该是

public:
 HelloWorld()
   {
   //......
   }

我找到了解决方案!

正如消息所建议的那样,我必须在 CMakeLists.txt 中添加我的文件。不需要头文件,但必须在 CMakeLists.txt

中添加 .cpp 文件

为了让链接器找到实现文件,我不得不添加

src/main/cpp/HelloWorld.cpp in my CMakeLists.txt

这是完整的 CMakeLists 文件:

cmake_minimum_required(VERSION 3.4.1)
add_library( # Sets the name of the library.
         native-lib

         # Sets the library as a shared library.
         SHARED

         # Provides a relative path to your source file(s).
         # Associated headers in the same location as their source
         # file are automatically included.
         src/main/cpp/native-lib.cpp
         src/main/cpp/HelloWorld.cpp)
find_library( # Sets the name of the path variable.
          log-lib

          # Specifies the name of the NDK library that
          # you want CMake to locate.
          log )
target_link_libraries( # Specifies the target library.
                   native-lib
                   # Links the target library to the log library
                   # included in the NDK.
                   ${log-lib} )