2011/08/16

[a500]Acer A500でPaSoRiを動かすことよりも、C++をJavaに移植する方が難しい

盆休み、特にやることもなかったので、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 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。