1. ホーム
  2. Android

Jniエラー:構造体でも組合でもないものにメンバー 'FindClass' を要求する、 解決方法

2022-02-14 18:09:54
原文のままです。 http://topic.csdn.net/u/20110120/10/ef601a64-27fa-4a80-96be-39dbcb644cbc.html

質問です。

androidでJNIを使用すると、常にエラーを報告する
packages/apps/SystemMointor/jni/proc_reader.c:78: error: request for member 'GetStringUTFChars' in something not structure or union
packages/apps/SystemMointor/jni/proc_reader.c:92: error: member 'FindClass' in something not structure or union request for the member 'FindClass' in something not structure or union.
packages/apps/SystemMointor/jni/proc_reader.c:94: error: request for member 'NewObjectArray' in something not structure or union
packages/apps/SystemMointor/jni/proc_reader.c:96: error: request for member 'FindClass' in something not structure or union
packages/apps/SystemMointor/jni/proc_reader.c:98: error: request for member 'GetFieldID' in something not structure or union
packages/apps/SystemMointor/jni/proc_reader.c:99: error: request for member 'GetFieldID' in something not structure or union
packages/apps/SystemMointor/jni/proc_reader.c:108: error: member 'SetObjectField' in something not structure or union request for the member 'SetObjectField' in something not structure or union
packages/apps/SystemMointor/jni/proc_reader.c:108: error: member 'NewStringUTF' in something not structure or union request for the member 'NewStringUTF'。
packages/apps/SystemMointor/jni/proc_reader.c:116: error: member 'SetObjectField' in something not structure or union request for the member 'SetObjectField' in something not structure or union
packages/apps/SystemMointor/jni/proc_reader.c:118: error: member 'SetObjectArray' in something not structure or union request for the member 'SetObjectArray' in something not structure or union


解決策

問題は解決し、次のようなことが判明しました。
cプログラムであれば、(*env)->を使用します。
C++の場合はenv->を使用します。
ps:Linuxでは、.cファイルが"env->"でコンパイルされると構造体が見つからないので、"(*env)->"を使うか、c++でコンパイルするために.cppファイルへ変更する必要があります。
以下はその相違点です。
jni.h内
struct JNINativeInterface_;
struct JNIEnv_;
#ifdef __cplusplus
typedef JNIEnv_ JNIEnv;
#else
typedef const struct JNINativeInterface_ *JNIEnv;
#endif
/*
* C++では、プログラマが書けるようにインライン関数を使用しています。

* env->FindClass("java/lang/String")を使用します。
*
* よりもC++で。
*
* (*env)->FindClass(env, "java/lang/String")
*
* C言語での
*/
つまり、C++では
env->FindClass("java/lang/String")を使用します。
C言語での使用
(*env)->FindClass(env, "java/lang/String")を使用します。