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
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")を使用します。
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")を使用します。
関連
-
android:ems="10 "とは何ですか?
-
Android ARTランタイムのDalvik仮想マシンをシームレスに置き換えるプロセスの分析
-
RecyclerViewです。アダプタが接続されていないため、レイアウトをスキップする
-
Android リソースのリンクに失敗する、解決方法
-
Androidにおけるメッセージの仕組みの分析 - 解決策。ビュー階層を作成した元のスレッドだけが、そのビューに触れることができる。
-
リターンスタックpopBackStack()のAndroidフラグメント、リターンonResumeの問題
-
Android eclipseが起動できない:選択項目を起動できず、最近起動した項目もない
-
Android 問題集 No.11:トランスポートエンドポイントが接続されていない
-
Androidです。ViewPagerで現在のインターフェイスのFragmentを取得する
-
AndroidのSMSメッセージ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Dalvik仮想マシンと学習プランの簡単な紹介
-
My Android Notes (XI) - 環境設定を使って設定を保存する
-
Androidです。GridViewコントロールの使用
-
Androidバージョン一覧
-
ConstraintLayoutにおけるChainとGuidelineの利用について
-
Intellij Ideaは、シンボルが見つからない、RクラスまたはRパッケージが存在しない、というエラーを報告します。
-
Android ProgressBar解説 ProgressBarの色を変更する
-
Android TextViewは、あるテキストのカラー・フォント・サイズを設定する
-
React Native エラー。アプリケーション XXX は登録されていません ソリューション
-
Androidエラー:このターゲットで使用できるCPU/ABIシステムイメージがありません。