盆休み、特にやることもなかったので、C++で作っていたRC-S620/SというかPaSoRiというか、とにかくRC-S956系のチップ用ライブラリをJavaに移植していた。
半分くらい移植できたと思うので、githubにおいた。
うまく動けば、NFCIDを取ってくれると思う。
しかし・・・出来が悪い。
Androidのアプリとしての出来がよくないので、なんか落ちる。
なんか、メニューから起動させると2回に1回落ちるのだが、まあいいや。
いや。。。ここをいつもないがしろにしているから、適当なものしかできあがらないのだ。
あとで調べよう。
苦労しているのが、Java。
メモリの確保をちょくちょくやるのがいやなので、ポインタを使い回したりしているのだ。
そのあたりが、どうにもこうにも。
それと、引数で戻り値をとってくる場合のやり方もよくわかってない。
void func(int[] retval) {
retval[0] = 20;
}
void aaa() {
int[] ret = new int[1];
func(ret);
}
こんなことをやっているのだよ、今のソースファイルは。
元のソースは、こんなのだ。
void func(int* retval)
{
*retval = 20;
}
void aaa()
{
int ret;
func(&ret);
}
たぶんやり方があるんだろうけど、わからんかった。
それ以上にわからなかったのが、ダブルポインタ。
ライブラリ側にバッファを持たせているけど、そこにデータを書き込んでもらうため、引数でポインタを返していたのだ。
namespace {
uint8_t wBuf[50];
}
bool getCmdBuf(uint8_t** p)
{
*p = &wBuf[5];
}
まあ、イメージとしてはこんな感じ。
プロトコルを作るとき、アプリの層は一番下で、そこから上にヘッダを積んでいく形になるではないか。
今回は固定ヘッダ長なので、ユーザ側には書き込んでほしいポインタを渡したかったのだ。
ByteBufferが使えそうだな、と思ってbyte[]を置き換えていったけど、うまくいかなかった。
敗北だ。。。
やむなくローカルでmemcpy()みたいなのを作って、あちこちコピーするように変更。
動くんだけど、格好が悪い。
なんとかしたいなぁ。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。