Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从JNI中的原语获取数字的简单方法?_Java_C++_Java Native Interface - Fatal编程技术网

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

Java 从JNI中的原语获取数字的简单方法?,java,c++,java-native-interface,Java,C++,Java Native Interface,我想从C调用一个java方法,该方法接受一个参数T extends Number。我知道java默认情况下会为您执行这些类型的自动装箱,但当我尝试在JNI调用中传递float或jfloat时,会出现以下错误: FATAL ERROR in native method: Bad JNI oop argument 有没有一种简单的方法可以生成一个Numberjava类,或者使用JNI将它从C传递给一个java方法参数,而不考虑实际的原语类型?给定的java类 class CC { stat

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

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);
#包括
jclass floatClass=(*env)->FindClass(env,“java/lang/Float”);
jmethodidfloatconstructor=(*env)->GetMethodID(env,floatClass,”,“(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);

我改进了我的问题,但我真的希望有一种方法可以做到这一点,而不必调用特定的类,如
Float
。唉,答案是否定的。你不可能理解我的想法:(到目前为止,我正在按照您的建议进行操作,但我希望实现一个更为数字中立的实现。正确,但java为您进行自动装箱。如果我将一个数字传递给一个带有
Number
参数的成员,java为我进行转换,我希望如果我通过JNI调用它,它也会进行转换,但它不会。BOxin是由编译器完成的,这就是为什么代码>列表是“代码>列表”。JNI是在java编译器的帮助下完成的。您可以构建自己的C++模板集,以隐藏“装箱”部分,但这很少是麻烦。