0

これに似たコードがあります

struct time
{
    long milliscnds;
    int  secs;
}

私のJavaファイルには、次のようなものがありました

class jtime
{
    long millscnds;
    int  secs;
}

新しい jtime 時間 = 新しい jtime();

public int native getTimeFromC(オブジェクト時間);

ネイティブクラスで

getTimeFromc(JNIEnv* env, jobject thiz,jobject jtime)
 {
   struct time *mytime = getTime(); 

  now to fill the jtime with mytime
 }

提案してください?

4

2 に答える 2

1

Java クラスと必要な JNI コードを簡素化できます。

現在、ネイティブ メソッドにはいくつかの問題があります。

public int native getTimeFromC(object time);
  1. パラメータは ですObjectが、 である必要がありますjtime
  2. 戻り値には目的がないようです。
  3. このメソッドはオブジェクトを完全に初期化するので、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すると、コンストラクターの署名を確認できます。

于 2013-05-02T16:35:16.320 に答える