Как создать класс C ++ (.h и .cpp) в Android-студии?

Я учусь использовать Android NDK и пытаюсь создать собственный класс C ++ (.h и .cpp). Я следовал официальному туториалу (https://developer.android.com/studio/projects/add-native-code.html) для достижения этой цели. Мне удалось создать простой класс C ++ и вызвать его из Java, без проблем.

Теперь я хочу создать свой собственный класс C ++ (скажем, класс HellowWorld) только с конструктором, который ничего не делает. чтобы сделать это, я щелкаю правой кнопкой мыши по моей папке cpp, в которой находится моя уже работающая оболочка JNI.

Я создаю свой класс и создаю конструктор по умолчанию и вызываю его из моей функции JNI, но он потерпел крах во время компиляции:

Ошибка: СБОЙ: Сбой сборки с исключением.

  • Что пошло не так:
    Не удалось выполнить задачу «: app: externalNativeBuildDebug».

    Команда сборки не удалась.
    Ошибка при выполнении «C: \ Users \ lucien.moor \ AppData \ Local \ Android \ Sdk \ cmake \ 3.6.3155560 \ bin \ cmake.exe» с аргументами {—build C: \ Users \ lucien.moor \ Desktop \ tmp \ MyApplication2 \ app.externalNativeBuild \ cmake \ debug \ mips64 —target native-lib}
    [1/2] Создание объекта CXX CMakeFiles / native-lib.dir / src / main / cpp / native-lib.cpp.o
    [2/2] Связывание совместно используемой библиотеки CXX …….. \ build \ middleates \ cmake \ debug \ obj \ mips64 \ libnative-lib.so
    СБОЙ: cmd.exe / C «cd. && C: \ Users \ lucien.moor \ AppData \ Local \ Android \ sdk \ ndk-bundle \ toolchains \ llvm \ prebuilt \ windows-x86_64 \ bin \ clang ++. Exe —target = mips64el-none-linux-android —gcc -toolchain = C: /Users/lucien.moor/AppData/Local/Android/sdk/ndk-bundle/toolchains/mips64el-linux-android-4.9/prebuilt/windows-x86_64 —sysroot = C: / Users / lucien. moor / AppData / Local / Android / sdk / ndk-bundle / платформы / android-21 / arch-mips64 -fPIC -g -DANDROID -функция-разделы -funwind-tables -fstack-protector-strong -no-canonical-prefixes — Ва, — noexecstack -Wformat -Werror = формат-безопасность -g -DANDROID -функция-разделы -funwind-таблицы -fstack-protector-strong -no-канонические-префиксы -Wa, — noexecstack -Wformat -Werror = format- security -O0 -fno-limit-debug-info -O0 -fno-limit-debug-info -Wl, — build-id -Wl, — warn-shared-textrel -Wl, — fatal-warnings -Wl, —no-undefined -Wl, -z, noexecstack -Qunused-arguments -Wl, -z, relro -Wl, -z, теперь -Wl, — build-id -Wl, — warn-shared-textrel -Wl , — фатальные предупреждения -Wl, — нет не определено -Wl, -z, noexecstack -Qunused-a rguments -Wl, -z, relro -Wl, -z, теперь -shared -Wl, -soname, libnative-lib.so -o …….. \ build \ middleates \ cmake \ debug \ obj \ mips64 \ libnative-lib.so CMakeFiles / native-lib.dir / src / main / cpp / native-lib.cpp.o -llog -lm «C: /Users/lucien.moor/AppData/Local/Android/sdk/ndk расслоение / источники / CXX-СТЛ / гну-libstdc ++ / 4,9 / ЛИЭС / MIPS64 / libgnustl_static.a» && cd. «CMakeFiles / native-lib.dir / src / main / cpp / native-lib.cpp.o: в функции Java_he_1arc_myapplication2_MainActivity_stringFromJNI':
    C:\Users\lucien.moor\Desktop\tmp\MyApplication2\app\src\main\cpp/native-lib.cpp:10: undefined reference to
    HelloWorld :: HelloWorld ()»
    clang ++. exe: error: сбой команды компоновщика с кодом выхода 1 (используйте -v для просмотра вызова)
    ниндзя: сборка остановлена: подкоманда не выполнена.

  • Пытаться:
    Запустите с параметром —stacktrace, чтобы получить трассировку стека. Запустите с параметром —info или —debug, чтобы получить больше вывода журнала.

Я думаю, что есть проблема при связывании файлов .h и .cpp. Когда я пытаюсь реализовать мой конструктор, он работает нормально. он просто не находит реализацию .cpp.

Вот мой файл JNI native-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_Hclass HelloWorld {
public:
HelloWorld();
};
#endif //MYAPPLICATION2_HELLOWORLD_H

и вот мой HelloWorld.cpp

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

когда я открываю этот файл, андроид студия говорит мне «Этот файл не является частью проекта. Пожалуйста, включите его в соответствующий файл сборки (build.gradle, CMakeLists.txt или Android.mk и т. Д.) И синхронизируйте проект».

Итак, как мне связать эти прекрасные .h и .cpp вместе?

1

Решение

Я нашел решение!

как и предполагалось в сообщении, мне пришлось добавить свой файл в CMakeLists.txt. Файл заголовков не требуется, но файл .cpp должен быть добавлен в CMakeLists.txt.

Чтобы компоновщик мог найти файл реализации, я должен был добавить

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} )
4

Другие решения

public:
HelloWorld();

Это должно быть по крайней мере

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