Я не знаком с 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:
Я читал о JNIEXPORT
а также Java_my_package_name_SomeClass_someMethod()
но я не уверен, как его использовать: мне нужно изменить сам код C ++ или я должен разработать обертку для него?
Заранее большое спасибо за вашу помощь.
Хорошо, спасибо @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());
}
}
Других решений пока нет …