Kotlin、NDK和C++的相互作用
Kotlin, NDK and C++ interactions
我不熟悉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++支持(?如果是,我该如何使用它
我读过关于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
与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());
}
}