Kotlin、NDK和C++的相互作用

Kotlin, NDK and C++ interactions

本文关键字:相互作用 C++ NDK Kotlin      更新时间:2023-10-16

我不熟悉Android NDK,需要帮助使用C++编写的本地代码构建Kotlin应用程序。我找到了使用基本C函数的HelloWorld示例,但没有使用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++支持(?如果是,我该如何使用它

我读过关于JNIEXPORTJava_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

与kotlin部分相同的API,但方法使用完整的包名称命名。在这里,我要翻译的是科特林世界和本土世界之间的关系。

#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());
}
}