代码之家  ›  专栏  ›  技术社区  ›  Bruno

Kotlin,NDK和C++交互

  •  0
  • Bruno  · 技术社区  · 6 年前

    我不熟悉Android NDK,我需要帮助构建一个KTLIN应用程序,使用C++编写的本地代码。我用基本C函数找到了HeloRoLLD样本,但是没有使用C++对象的例子或教程。

    假设我有一个C++对象,带有HPP和CPP文件:

    对象.hpp

    #ifdef object_hpp
    #define object_hpp
    //
    // include part
    //
    
    class Object {
      // some stuff
    }
    #endif
    

    对象.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++代码本身还是应该开发一个包装器呢?

    非常感谢你的帮助。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Bruno    6 年前

    好吧,多亏了@Richard,这是我的包装纸

    对象包装器.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());
        }
    }