0

Palm Pilot プログラムを Android 用に書き直していますが、壁にぶつかりました。私は C の経験が不足しているため、アイデアを完全に失ってしまいます。これは元の C コードです。

.hファイル:

typedef void (__stdcall *fp_setbaud)(WORD);
typedef short (__stdcall *fp_get)(WORD);
typedef void (__stdcall *fp_put)(BYTE);
typedef void (__stdcall *fp_flush)(void);
typedef void (__stdcall *fp_delay)(WORD);
//typedef void (__stdcall *fp_err)(WORD);
typedef short (__stdcall *fp_ProgressUpdate)(WORD);

.cファイル:

fp_setbaud RelayAPI_SetBaud;
fp_get RelayAPI_get;
fp_put RelayAPI_put;
fp_flush RelayAPI_flush;
fp_delay RelayAPI_delay;
fp_ProgressUpdate RelayAPI_ProgressUpdateTX;
fp_ProgressUpdate RelayAPI_ProgressUpdateRX;


BYTE __stdcall InitRelay(fp_setbaud _setbaud, fp_get _get, fp_put _put, fp_flush _flush, fp_delay _delay){

    RelayAPI_SetBaud=_setbaud;
    RelayAPI_get=_get;
    RelayAPI_put=_put;
    RelayAPI_flush=_flush;
    RelayAPI_delay=_delay;
    RelayAPI_ProgressUpdateTX=0;
    RelayAPI_ProgressUpdateRX=0;
    ...
}

その後、コードの後半で、これらの関数は次のように呼び出されます。

if(baud9600) RelayAPI_SetBaud(9600);
else RelayAPI_SetBaud(1200);

old Cファイルのメインメソッドでは、InitRelayこのように呼び出されます...

InitRelay(Changeit,getit,putit,flushit,delayit);

5 つのパラメーターはすべて、そのメイン ファイルで宣言された関数です。

Java コードから呼び出したいのですInitRelayが、渡された関数はすべて Palm Pilot 機能を処理します。Android アプリケーション用にすべて Java で書き直したので、それらを使用したいと思います。だから、これは私がやったことです...

jmethodID changeID;
jmethodID getID;
jmethodID putID;
jmethodID flushID;
jmethodID delayID;
// These two below are COMPLETELY wrong.
jmethodID RelayAPI_ProgressUpdateTX;
jmethodID RelayAPI_ProgressUpdateRX;
jclass    bluetoothClass;

BYTE __stdcall InitRelayJava( JNIEnv *env, jobject obj  ) {

bluetoothClass = (*env)->GetObjectClass( env, obj );

    changeID = (*env)->GetMethodID( env, bluetoothClass, "changeitJava", "(I)Z"  );
    getID    = (*env)->GetMethodID( env, bluetoothClass, "getitJava"   , "()V"   );
    putID    = (*env)->GetMethodID( env, bluetoothClass, "putitJava"   , "([B)V" );
    flushID  = (*env)->GetMethodID( env, bluetoothClass, "flushitJava" , "()V"   );
    delayID  = (*env)->GetMethodID( env, bluetoothClass, "delayitJava" , "(I)V"  );

    RelayAPI_SetBaud= env->CallBooleanMethod( bluetoothClass, changeID , int rate    );
    RelayAPI_get    = env->CallVoidMethod   ( bluetoothClass, getID                  );
    RelayAPI_put    = env->CallVoidMethod   ( bluetoothClass, putID    , byte[] buff );
    RelayAPI_flush  = env->CallVoidMethod   ( bluetoothClass, flushID                );
    RelayAPI_delay  = env->CallVoidMethod   ( bluetoothClass, delayID                );
    RelayAPI_ProgressUpdateTX=0;
    RelayAPI_ProgressUpdateRX=0;
    ....
}

私が行ったことには 2 つの問題があります。2) 実際に Android 版で RelayAPI_* メンバーを定義すると、私がしようとしていることはまったくありません。呼び出しは実際にはenv->CallXXXMethodこれらのメソッドを呼び出しています (私が知っている間違った方法で、視覚化するために書き出されています)。これらのメンバーを POINTERS に等しく設定して、それらの関数呼び出しを行う必要があります。

この2つの問題を解決する方法を知っている人がいたら教えてください。私がすべて間違っている場合は、その情報にも感謝します。ここに私が取り組んできたいくつかのチュートリアルがありますが、私が抱えている問題に関連するものは何もありません.

チュートリアル 1

チュートリアル 2

チュートリアル 3

4

1 に答える 1

1

このようなものはどうですか:

typedef void (*fp_setbaud)(WORD);

void WrapSetBaud(WORD w) {
    env->CallBooleanMethod( bluetoothClass ...
}

fp_setbaud RelayAPI_SetBaud = WrapSetBaud;

等々。あなたは私が望む写真を手に入れます。ラッパーがアクセスできるように、env をどこかにグローバルに保存する必要があります。

于 2012-07-26T15:35:37.807 に答える