如何将 NULL 分配给浮点/双精度变量?

Jin*_*won 3 c java-native-interface

我在使用 JNI 时遇到问题。

jboolean z = (jboolean) NULL; // ok
jbyte    b = (jbyte)    NULL; // ok
jchar    c = (jchar)    NULL; // ok
jshort   s = (jshort)   NULL; // ok
jint     i = (jint)     NULL; // ok
jlong    j = (jlong)    NULL; // ok

jobject  l = (jobjec)   NULL; // ok

jfloat   f = (jlong)     NULL; // NOT OK 
jdouble  d = (jdouble)   NULL; // NOT OK
Run Code Online (Sandbox Code Playgroud)

编译器抱怨

[ERROR] /....c:112:28: error: pointer cannot be cast to type 'jfloat' (aka 'float')
[ERROR]   jfloat result = (jfloat) NULL;
[ERROR]                            ^~~~
[ERROR] /usr/include/sys/_types/_null.h:29:15: note: expanded from macro 'NULL'
[ERROR] #define NULL  __DARWIN_NULL
[ERROR]               ^~~~~~~~~~~~~
[ERROR] /usr/include/sys/_types.h:52:23: note: expanded from macro '__DARWIN_NULL'
[ERROR] #define __DARWIN_NULL ((void *)0)
[ERROR]                       ^~~~~~~~~~~
[ERROR] 1 error generated.
Run Code Online (Sandbox Code Playgroud)

我怎样才能解决这个问题?


我正在为每个值编写方法。

jboolean doSome() {
    jboolean result = (jboolean) NULL;
    /*
     * at here result may be initialized or remain as NULL
     */
    return result;
}
Run Code Online (Sandbox Code Playgroud)

我打算编写一个结合以下三种方法的函数。

(*env)->GetObjecClass(JNIEnv *, jobject);
(*env)->GetMethodID(JNIEnv *, jclass, char *, char *);
(*env)->CallBooleanMethodA(JNIEnv *, jclass, jmethodID, jvalue *);
Run Code Online (Sandbox Code Playgroud)

像这样。

jboolean CallBooleanMethodAMmMs(JNIEnv * env, jobject obj, char * mname,
                                char * msig, jvalue * args) {
  jboolean result = (jboolean) NULL;
  jclass clazz = (*env)->GetObjectClass(env, obj);
  jmethodID methodID = (*env)->GetMethodID(env, clazz, mname, msig);
  if (methodID != NULL) {
    result = (*env)->CallBooleanMethodA(env, obj, methodID, args);
  }
  (*env)->DeleteLocalRef(env, clazz);
  return result;
}
Run Code Online (Sandbox Code Playgroud)

我认为我可以用于NULL任何不成功的情况,例如methodID == NULL.

我想我应该使用 ajobject而不是基元,对吧?

Nat*_*tta 5

您不能(也不应该)将指针分配给普通变量。

正如您所提到的,我真的不知道为什么它允许其他一些普通数据类型。编译器应该对从指针到其他非指针数据类型的所有赋值产生相同的警告

NULL是stdio.h中定义的void指针,用于初始化指针类型变量。0如果NULL您想初始化非指针变量,请使用 simple 代替。