从 JNI 中的原语获取数字的简单方法

Easy way to get Number from primitive in JNI?

本文关键字:数字 简单 方法 获取 原语 JNI      更新时间:2023-10-16

我想从 C 调用一个接受参数T extends Number 的 java 方法。我知道java默认为您执行这些类型的自动装箱,但是当我尝试在JNI调用中传递floatjfloat时,出现以下错误:

FATAL ERROR in native method: Bad JNI oop argument

有没有一种简单的方法来生成一个Number的java类或使用JNI将其传递给C的Java方法参数,而不关心实际的基元类型?

给定的Java类

class CC {
    static void callbackMethod(Number number) {
        Log.i("callbackMethod", "arg = " + number);
    }
}

您可以使用native.c

#include <jni.h>
jclass floatClass = (*env)->FindClass(env, "java/lang/Float");
jmethodID floatConstructor = (*env)->GetMethodID(env, floatClass, "<init>", "(F)V");
jobject floatObj = (*env)->NewObject(env, floatClass, floatConstructor, (jfloat)1.23);
jclass callbackClass = (*env)->FindClass(env, "CC");
jmethodID callback = (*env)->GetMethodID(env, callbackClass, "callbackMethod", "(java/lang/Object)V");
(*env)->CallVoidMethod(env, callbackClass, callback, floatObj);