native学习一(动态库的函数注册)

1、JNIDynamicLoad.java

package com.example.demo.jni;

/**
 * author : huangyi
 * date   : 2020/2/9
 * desc   :jni动态注册
 */
public class JNIDynamicLoad {

    static {
        System.loadLibrary("dynamic-lib");
    }

    public native int sum(int x, int y);

    public native String getNativeString();
}

2、jni_dynamic_load.cpp

#include <base.h>
#include <jvm.h>

#define JAVA_CLASS "com/example/demo/JNIDynamicLoad"

jstring getMessage(JNIEnv *env, jobject jobj) {
    return env->NewStringUTF("this is msg");
}

jint plus(JNIEnv *env, jobject jobj, int x, int y) {
    return x + y;
}

static JNINativeMethod gMethods[] = {
        {"getNativeString", "()Ljava/lang/String;", (void *) getMessage},
        {"sum",             "(II)I",                (void *) plus}
};

int registerNativeMethods(JNIEnv *env, const char *name, JNINativeMethod *methods, jint nMethods) {
    jclass jcls;
    jcls = env->FindClass(name);
    if (jcls == nullptr) {
        return JNI_FALSE;
    }
    if (env->RegisterNatives(jcls, methods, nMethods) < 0) {
        return JNI_FALSE;
    }
    return JNI_TRUE;
}

JNIEXPORT int JNICALL JNI_OnLoad(JavaVM *vm, void * reserved) {
    JNIEnv *env;
    if (vm->GetEnv(reinterpret_cast<void **>(&env), JNI_VERSION_1_6) != JNI_OK) {
        return JNI_FALSE;
    }

    //setJvm(vm);

    registerNativeMethods(env, JAVA_CLASS, gMethods, 2);
    LOGD("jni onload call");
    return JNI_VERSION_1_6;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用Kotlin/Native中的CInterop来调用C动态库。首先需要定义C函数的原型,并使用Kotlin的CName注解来指定C函数的名称。然后使用external关键字在Kotlin函数中声明C函数,并使用CName注解来指定C函数的名称。最后可以直接调用该Kotlin函数来调用C动态库中的函数。 以下是一个示例代码: ```kotlin import kotlinx.cinterop.* fun main() { // Load C dynamic library val lib = dlopen("libfoo.dylib", RTLD_LAZY) // Define C function prototype typealias my_c_function_t = CFunction<IntVar.(CPointer<ByteVar>) -> Unit> // Declare C function using external and CName annotations @CName("my_c_function") external fun myCFunction(ptr: CPointer<ByteVar>): Int // Call C function memScoped { val buffer = allocArray<ByteVar>(1024) val result = myCFunction(buffer) println("C function returned: $result") } // Unload C dynamic library dlclose(lib) } ``` 在上面的示例代码中,我们首先使用dlopen函数加载了一个C动态库,并获得了一个句柄。然后我们使用typealias定义了一个C函数的原型类型my_c_function_t,并使用CName注解指定了该C函数动态库中的名称。接着我们使用external关键字和CName注解声明了一个Kotlin函数myCFunction,并指定了该函数的原型类型。最后我们可以直接调用该函数,以便调用C动态库中的函数。在函数调用结束后,我们使用dlclose函数关闭了动态库。 当然,这只是一个简单的示例。在实际应用中,可能需要更多的CInterop技巧来访问C结构体、使用C指针、处理C回调函数等等。但是,Kotlin/Native提供了丰富的工具和库来方便地与C代码交互,让我们可以更轻松地完成这些任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值