【Android】【NDK】JNIのパッケージ名、クラス名に_(アンダースコア)がある場合
JNIの関数名は以下の命名規約があります。
関数名規約
"
_パッケージ名_クラス名_メソッド名"
それぞれを_(アンダースコア)でつなぐわけですが、
そもそもパッケージ名、クラス名に_(アンダースコア)があったらどうなるんだろう?
ということで試してみました。
Java側
パッケージ名:my.kotatsu.ndk_practice
クラス名:MainActivity
C側
関数名:Java_my_kotatsu_ndk_practice_MainActivity_stringFromJNI()
予想通り UnsatisfiedLinkError をくらいました...
解決方法がないものかなーと探しみると…あった!
つなぎの _ じゃない場合は _1でエスケープできるようです。
先ほどの例でいくと、
Java_my_kotatsu_ndk_1practice_MainActivity_stringFromJNI()
とすればOKです。
じゃあパッケージ名に _1 があったら!!?
パッケージ名:my.kotatsu.ndk_practice_1
関数名:Java_my_kotatsu_ndk_1practice_11_MainActivity_stringFromJNI
うん。これで動きますね。
なかなかこの情報に辿り着くのに苦労(なんて検索すればいいのかわからない)
したので、より多くの人が解決できるようにSEO対策しときます↓
アンスコ、アンダーライン、アンダーバー
参考HP
http://qarc.info/qa/show-8916-161.html
【node.js+express】ejs のコメントアウト
ejs で View を書く際にコメントを書くやり方です。
<% // コメント %>
これでいけると思いきやエラー。 この書き方だと // 以降すべてがコメントとみなされてしまうようです。
<% /* コメント */ %>
ということでこちらが正解です。
【node.js】 Cookie が別のページに渡せない
node.js+express環境 で Cookie を使おうとしたら以下のようなことが起きました。
① hoge.com/test のページで Cookie 'aaa' に 値 1 を保存
res.cookie('aaa', 1);
② hoge.com/test2 のページで ①で保存した Cookie 'aaa' を取得
var cookies = {}; req.headers.cookie && req.headers.cookie.split(';').forEach(function( cookie ) { var parts = cookie.split('='); cookies[ parts[ 0 ].trim() ] = ( parts[ 1 ] || '' ).trim(); }); if( cookies['aaa'] ){ var aaa=cookies['aaa']; }
変数 aaa に 1 が入っている予定でしたがからっぽ…
hoge.com/test では取得できたので、hoge.com/test2 に Cookie が送られていないっぽい。
Cookieを覗いたりして調べてみると、Cookie 'aaa' に /test の path属性がついてる様子。
つまり、hoge.com/test/* のページにしか Cookie 'aaa' は送られていないということです。
なるほど…では path 属性を指定して Cookie を作成してあげればよさそうだ。
ということで、①を以下に変更。
res.cookie('aaa', 1, { path: '/' });
これで hoge.com/test2 でもCookie が取得できました!
【iPhone】WebViewのエラーハンドリング
iOSのWebViewでエラーが発生した時の詳細なエラーハンドリングの方法。
エラーが起きた時は didFailLoadWithError が実行されるので、そこでアラートなんかを出す処理をするのが定石ですが、なんでもかんでもエラー扱いをしているとユーザ操作により、WEBページの読み込み中止をした場合でもアラートがでてしまったりします。
なので、適切にエラーハンドリングする必要がありそうです。
下記で読み込み中止時のアラート表示は防げます。
// Webページ読み込み失敗時 - (void)webView:(UIWebView*)view didFailLoadWithError:(NSError*)error { // キャンセルボタン押下時以外 if([error code] != NSURLErrorCancelled) { //アラート表示処理 } }
【Android】【NDK】コンパイルオプションだけでとりあえず性能を出す方法
NDKでコードを変えたく無いけど性能は上げたい…という場合は
以下のオプションで性能が上がるかもしれません。
$ ndk-build NDK_DEBUG=0
NDKで作成したCプログラムをデバッグするで紹介したデバッグオプションを 0 にしています。
このオプションで gcc の最適化オプション -O2 がつきます。
必ずというわけではありませんが最適化により性能があがるかもしれません。
【Android】実行時間を計る
実行時間を計ってログに出力する方法。
よく使うのでメモメモ。
long start = System.currentTimeMillis(); (処理) long stop = System.currentTimeMillis(); Log.d("タグ", "処理時間:" + (stop - start) + " msec");