我不熟悉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.方法的关键字外部表示正文在其他地方.就我而言,在包装器的本机层中.
class ObjectWrapper {
companion object {
init {
System.loadLibrary("mylibrary")
}
}
external fun sayHello(name: String): String
}
MyLibrary.cpp
与kotlin部分相同的API,但方法以完整的包名称命名.在这里,我必须在kotlin世界和本土世界之间进行翻译.
#include
#include
#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());
}
}
标签:android,c,android-ndk,kotlin
来源: https://codeday.me/bug/20191002/1842391.html