【问题标题】:Kotlin, NDK and C++ interactionsKotlin、NDK 和 C++ 交互
【发布时间】:2018-07-31 12:57:44
【问题描述】:

我不熟悉 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++ 代码本身还是应该为其开发一个包装器?

非常感谢您的帮助。

【问题讨论】:

  • JNI 是一个 C 接口。您将需要开发一个包装器来调用/使用 C++。完整的文档、示例等在这里:developer.android.com/ndk
  • 我读过这个,但是样本不是很清楚;)这是否意味着我的包装器必须包含带有Java_my_package_name_SomeClass_someMethod() 定义的JNIEXPORT 宏?我刚刚使用 C++ 对象找到了this sample。我试试看

标签: android c++ kotlin android-ndk


【解决方案1】:

好的,感谢@Richard,这是我的包装

ObjectWrapper.kt

公开我想要使用的 API。该方法的关键字external 表示主体在别处。就我而言,在包装器的本机层中。

class ObjectWrapper {

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

    external fun sayHello(name: String): String
}

MyLibrary.cpp

与 kotlin 部分相同的 API,但方法以完整的包名称命名。在这里,我不得不在 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());
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-08
    • 2010-10-03
    • 1970-01-01
    • 2018-05-24
    • 1970-01-01
    相关资源
    最近更新 更多