Developer's memo

開発メモ

【Android】【NDK】JNIのパッケージ名、クラス名に_(アンダースコア)がある場合

JNIの関数名は以下の命名規約があります。

 

関数名規約 

"Java_パッケージ名_クラス名_メソッド名"

 

それぞれを_(アンダースコア)でつなぐわけですが、

そもそもパッケージ名、クラス名に_(アンダースコア)があったらどうなるんだろう?

ということで試してみました。

 

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】 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) {
                //アラート表示処理
        }
    
}
 
 
他にも以下の値でエラーをハンドリングできます。
それぞれの意味はAppleのリファレンスを参照。
 
   NSURLErrorUnknown = -1,
   NSURLErrorCancelled = -999,
   NSURLErrorBadURL = -1000,
   NSURLErrorTimedOut = -1001,
   NSURLErrorUnsupportedURL = -1002,
   NSURLErrorCannotFindHost = -1003,
   NSURLErrorCannotConnectToHost = -1004,
   NSURLErrorDataLengthExceedsMaximum = -1103,
   NSURLErrorNetworkConnectionLost = -1005,
   NSURLErrorDNSLookupFailed = -1006,
   NSURLErrorHTTPTooManyRedirects = -1007,
   NSURLErrorResourceUnavailable = -1008,
   NSURLErrorNotConnectedToInternet = -1009,
   NSURLErrorRedirectToNonExistentLocation = -1010,
   NSURLErrorBadServerResponse = -1011,
   NSURLErrorUserCancelledAuthentication = -1012,
   NSURLErrorUserAuthenticationRequired = -1013,
   NSURLErrorZeroByteResource = -1014,
   NSURLErrorFileDoesNotExist = -1100,
   NSURLErrorFileIsDirectory = -1101,
   NSURLErrorNoPermissionsToReadFile = -1102,
   NSURLErrorSecureConnectionFailed = -1200,
   NSURLErrorServerCertificateHasBadDate = -1201,
   NSURLErrorServerCertificateUntrusted = -1202,
   NSURLErrorServerCertificateHasUnknownRoot = -1203,
   NSURLErrorServerCertificateNotYetValid = -1204,
   NSURLErrorClientCertificateRejected = -1205,
   NSURLErrorCannotLoadFromNetwork = -2000,
   NSURLErrorCannotCreateFile = -3000,
   NSURLErrorCannotOpenFile = -3001,
   NSURLErrorCannotCloseFile = -3002,
   NSURLErrorCannotWriteToFile = -3003,
   NSURLErrorCannotRemoveFile = -3004,
   NSURLErrorCannotMoveFile = -3005,
   NSURLErrorDownloadDecodingFailedMidStream = -3006,
   NSURLErrorDownloadDecodingFailedToComplete = -3007
 
 参考
 

 

【Android】【NDK】コンパイルオプションだけでとりあえず性能を出す方法

NDKでコードを変えたく無いけど性能は上げたい…という場合は

以下のオプションで性能が上がるかもしれません。

 

$ ndk-build NDK_DEBUG=0

 

NDKで作成したCプログラムをデバッグするで紹介したデバッグオプションを 0 にしています。

このオプションで gcc の最適化オプション -O2 がつきます。

必ずというわけではありませんが最適化により性能があがるかもしれません。

 

 

【Android】【NDK】ndk-buildでコンパイルオプションを出力する方法

ndk-buildのgccでどんなオプションがついているのか知りたかったので

コンパイルオプションを見る方法を調べてみた。

$ ndk-build V=1

 

これでバッチリ出力されます!

 

 

【Android】実行時間を計る

実行時間を計ってログに出力する方法。

よく使うのでメモメモ。

 

long start = System.currentTimeMillis();
(処理)
long stop = System.currentTimeMillis();
Log.d("タグ", "処理時間:" + (stop - start) + " msec");