Java 从JNI中的原语获取数字的简单方法?
我想从C调用一个java方法,该方法接受一个参数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
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++模板集,以隐藏“装箱”部分,但这很少是麻烦。