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