JNI学習(二)、JNI基本言語知識

3818 ワード

一、ローカルメソッドのパラメータ
どのようにローカル方法がstaticとして宣言されていますか?
JNIEXPORT void JNICALL Java_comtao_test_NativeTest_sayHello  (JNIEnv*、jclass)
この二つのパラメータの意味は何ですか?JNIEnvタイプは実際にJava環境を表しています。このJNIEnv*ポインタを通して、Javaのコードを操作することができます。例えば、Javaクラスのオブジェクトを作成し、Javaオブジェクトを呼び出す方法、Javaオブジェクトの属性を取得するなどです。JNIEVの指針はJNIによってローカル方法の実現関数に導入され、Java端のコードを操作します。jclassは、この静的な方法クラスを呼び出すクラスのオブジェクト、つまりクラスクラスクラスのバイトコードを表します。
どのようにローカル方法がstaticとして宣言されていないのか、生成されたヘッダファイルのローカル方法は以下の通りである。
JNIEXPORT void JNICALL Java_comtao_test_NativeTest_sayHello  (JNIEnv*,jobject)
jobjectタイプはjavaのObjectタイプに相当し、このローカルメソッドを呼び出す対象を表していますが、実際には正確にはペアを維持しています。  この方法のオブジェクトの参照を呼び出します。例えば、new NativeTest().sayHello()の呼び出しの場合、この引用はこのnew NativeTest()の対象を指します。
JNIEnv類には多くの関数があります。   オブジェクトを作成
NewString  Stringオブジェクトを作成
New<TYPE>Aray  ある種類の配列を作成します。
Get/SetField   あるメンバー変数のプロパティGet/SetStaticFieldを取得または設定します。  スタティック変数としての属性Call<TYPE>Method/CallStatic<TYPE>Methodを取得または設定します。   あるjavaオブジェクトを呼び出す方法/または静的方法
など多くの関数
二、数値パラメータ
JavaコードでC\C++コードを呼び出すと、必ず数値の伝達があります。両者は異なるプログラミング言語に属しています。データの種類には多くの違いがあります。彼らの対応するタイプを知るべきです。例えば、Cはintとlongのデータタイプを持っているが、彼らの実現はプラットフォームに依存する。いくつかのプラットフォームでは、intタイプは16ビットであり、他のいくつかのプラットフォームでは32ビットの整数が発売されている。この原因に基づいて、Javaローカルインターフェースはジンt、jlongなどを定義します。
JavaタイプとC/C++データタイプとの対応関係は、これらの新規定義されたタイプ名とJavaタイプ名とが一致しており、前にjを追加しただけで、intはジンtに対応し、longはjlongに対応することがわかる。
私達はjni.hとjni_を見てみます。md.hヘッダファイルは、より直感的に理解できる:
typedef unsigned char   jboolean;
typedef unsigned short  jchar;
typedef short           jshort;
typedef float           jfloat;
typedef double          jdouble;
typedef long jint;
typedef __int64 jlong;
typedef signed char jbyte;
例えば、jintはJavaタイプintと同じタイプを表しているが、C/C++中intではないことがわかる。定義から見れば、Javaのint、jniの中のjintは、C/C++の中のlongタイプに対応しています。
したがって、ローカル方法でジンtタイプのデータを定義するには、表記はジンt i=10 Lとするべきです。
例えば、jcharはJavaタイプのcharタイプを表していますが、実はC/C++の中ではunsigned shartタイプです。C/C++の中ではtypedef unsigned shar gauという定義があります。tです。だから、jcharはC/C++の中の幅の文字に相当します。つまり、javaのcharです。  C/C++の幅の広い文字に相当します。したがって、ローカル方法でjcharタイプのデータを定義するには、標準的な書き方はjchar c=L'Cであるべきです。
実際には、jのタイプはすべてJavaのタイプを表しています。C/C++のタイプとは違います。だから内部で変換します。私たちは使う時も注意しなければなりません。JNI中の文字列の操作については後ろを見てもいいです。
三番目です。JavaオブジェクトのC\C++コードの形
jni.hヘッダのファイルを調べたら、下の内容が見えます。
class _jclass : public _jobject {};
class _jthrowable : public _jobject {};
class _jstring : public _jobject {};
class _jarray : public _jobject {};
class _jbooleanArray : public _jarray {};
class _jbyteArray : public _jarray {};
class _jcharArray : public _jarray {};
class _jshortArray : public _jarray {};
class _jintArray : public _jarray {};
class _jlongArray : public _jarray {};
class _jfloatArray : public _jarray {};
class _jdoubleArray : public _jarray {};
class _jobjectArray : public _jarray {};
実はこれらは添加されていますj頭文字の種類は、すべて_に集められています。jobject、これも私達のjavaの中を配慮するためで、Object種類はすべての種類の基質です。
これらのクラスは、JAVAのクラスに対応していますが、C/C++の中では中のタイプが変わっています。
四、jclass類とjclassの対象はどうなりますか?
Javaでは、クラスクラスコンパイルのバイトコードを表しています。このクラスでは、このクラスのすべての情報が含まれています。JNIでは同じように定義されています。それはjclassです。反射を知る人は皆、クラスがいかに重要かを知っています。反射によってjava類の情報とアクセス方法とメンバー変数が得られます。だからJNIの中には、クラスクラスを代表するjclass類もあります。
JNIEnvにはいくつかの方法があります。
1.jclass FindClass(const char*name){        return functions->FindClass(this,name); }
FindClassはシステムのclassipathの下でクラスを探して、完全なタイプに入ってきます。カバンの間隔に注意して使います。   / ,ではなく   たとえば:
jclass Custring=env->FindClass("java/lang/String")
2、jclass GetObject Class(jobject Oj){        return functions->GetObject Class(this,obj);    }
3、jclass Get Superclass(jclass sub){        return functions->Get Superclass(this,sub);    }
javaクラスのクラスのオブジェクト、すなわちjclassを得ると、反射と同じ形で、javaクラスのメンバー変数や方法などを得ることができます。