Java クラスと必要な JNI コードを簡素化できます。
現在、ネイティブ メソッドにはいくつかの問題があります。
public int native getTimeFromC(object time);
- パラメータは です
Object
が、 である必要がありますjtime
。
- 戻り値には目的がないようです。
- このメソッドはオブジェクトを完全に初期化するので、
jtime
オブジェクトを作成して返さないのはなぜjtime
でしょうか?
このクラス定義には、オブジェクトを作成するファクトリ メソッドと、一部の初期化作業を JNI 側から移動するコンストラクターがあります。
public class jtime {
long millscnds;
int secs;
public jtime(long millscnds, int secs) {
this.millscnds = millscnds;
this.secs = secs;
}
public native static jtime FromC();
}
ファクトリ メソッドは次のように実装できます。
JNIEXPORT jobject JNICALL Java_jtime_FromC
(JNIEnv * env, jclass clazz)
{
struct time *mytime = getTime();
jmethodID ctor = (*env)->GetMethodID(env, clazz, "<init>", "(JI)V");
jobject obj = (*env)->NewObject(env, clazz, ctor, mytime->milliscnds, mytime->secs);
return obj;
}
ヒント:このjavap
ツールは似javah
ていますが、非ネイティブ メソッドのシグネチャを表示します。を使用javap -s jtime
すると、コンストラクターの署名を確認できます。