Android — Kotlin, NDK и C ++ взаимодействия

Я не знаком с Android NDK, и мне нужна помощь для создания приложения Kotlin, используя нативную часть кода, написанного на C ++. Я нашел образец HelloWorld, использующий основную функцию C, но без примеров или учебников, использующих объекты C ++.

Допустим, у меня есть объект C ++ с файлами hpp и cpp:

object.hpp

#ifdef object_hpp
#define object_hpp
//
// include part
//

class Object {
// some stuff
}
#endif

object.cpp

#include "object.hpp"
Object::Object()
{
//constructor
}

std::string Object::sayHello(std::string value)
{
// do stuff
}

Я хочу знать, как лучше всего использовать его в приложении Kotlin:

  • я должен сначала создать библиотеку (.so или .a?) и импортировать ее в мое приложение? Если да, то есть что-то изменить в коде C ++?
  • я могу импортировать эти файлы C ++ в мой проект (с поддержкой C ++, я знаю это)? Если да, как я могу его использовать?

Я читал о JNIEXPORT а также Java_my_package_name_SomeClass_someMethod() но я не уверен, как его использовать: мне нужно изменить сам код C ++ или я должен разработать обертку для него?

Заранее большое спасибо за вашу помощь.

0

Решение

Хорошо, спасибо @Richard, вот моя обертка

ObjectWrapper.kt

Показывает API, который я хочу использовать. Ключевое слово external метода указывает, что тело находится в другом месте. В моем случае в родном слое обертки.

class ObjectWrapper {

companion object {
init {
System.loadLibrary("mylibrary")
}
}

external fun sayHello(name: String): String
}

MyLibrary.cpp

Тот же API, что и у части kotlin, но методы называются с полным именем пакета. Здесь я имею к переводу между миром kotlin и родным миром.

#include <jni.h>
#include <string>
#include "Object.h"
static Object *pObject = NULL;

extern "C" {
JNIEXPORT jstring Java_com_packagename_ObjectWrapper_sayHello(
JNIEnv *env,
jobject /* this */,
jstring input) {
pObject = new Object();
const char *msg = env->GetStringUTFChars(input, JNI_FALSE);
std::string hello = pObject->getHelloString(msg);
return env->NewStringUTF(hello.c_str());
}
}
0

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

Других решений пока нет …

По вопросам рекламы [email protected]