【Cocos2d-x】 非同期なので 【pd-for-android】


以前、作ったアプリを、例の Android 6 のパーミッション許可方法に対応させようと思ったら、意外に大変で、大改造になってしまった。

cocos2d-x の createScene() の最後で、Pd へ初期化データを送っていたんだけど、パーミッションの許可を求めるダイアログを表示している最中、つまりオーディオ関係の初期化なんか全然済んでいない時点で、じゃんじゃんデータを送ろうとしていた模様。

で、じゃぁ、Pd の初期化

bindService(new Intent(this, PdService.class), pdConnection, BIND_AUTO_REATE);

を呼び出したあとに、cocos 側へ、データを送って良しと知らせてやればどうかと思ったんだけど、こっちも Service を使っているもんで、いつ初期化が完了したかが分からず、失敗。

しょうがないので、github で推奨しているやり方 を、自分のアプリに対応させて、「Starting and stopping Pd audio」の、真ん中あたりの、

 try {
  /* sleep for one second to give Pd a chance to load samples and such;
    this is not always necessary, but not doing this may give rise to
    obscure glitches when the patch contains audio files */
  Thread.sleep(1000);
 } catch (InterruptedException e) {
   // do nothing
 }
}


のあとに、「データ送って良し!」と cocos側にお知らせするコードを書いて対処しました。

cocos側では、「初期データ送ってちょ」フラグを立てて、update でチェックして、データを送り出すような感じ。

まぁ、Thread.sleep の値によっては、機種によってコケる可能性もありそうだけど、AVD 上では上手くいっているようです。

起動時、1回だけの処理で、update を使うのは癪なのだが。
しかも、パーミッション許可のダイアログを表示するときだけ。

ドイツもコイツも非同期で動くのは困りもの。

スポンサーサイト

JniHelper::getStaticMethoInfo


いつも間違えるので、備忘録。

void InterfaceJNI::funcSendfloat(const char* value1, float value2){

  JniMethodInfo t;
  if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "function_name", "(Ljava/lang/String;F)V")){

    jstring stringArg1 = t.env->NewStringUTF(value1);

    t.env->CallStaticVoidMethod(t.classID, t.methodID, stringArg1, value2);
    t.env->DeleteLocalRef(stringArg1);
    t.env->DeleteLocalRef(t.classID);
  }
}



ま、こんな感じで指定しているのですが、文字列じゃない引数が複数あるとき、つい「;」をトークン的につけちゃう。
例えば Int 型3つだと、こんな感じ。

×   if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "function_name", "(I;I;I;)V")){
○   if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "function_name", "(III)V")){

文字列型の指定の Ljava/lang/String; の最後の「;」をトークンだと思っちゃうんだけど、大きな間違い。

「;」を含めて文字列の引数を表しているので、文字列型が複数ある場合は、

×   if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "function_name", "( Ljava/lang/String; Ljava/lang/String)V")){
○   if(JniHelper::getStaticMethodInfo(t, CLASS_NAME, "function_name", "( Ljava/lang/String; Ljava/lang/String;)V")){

最後に「;」が必要。

こちら様 が参考になりました。

エラー・メッセージ Failed to find static method id of ~ で、半日悩んで、やっと解消できたーと思ったら、実は役に立たない機能だったわけですよ。そんなのばっかり。

【AVD】 音が出なくなっちゃった問題


AVD が、サンプリング・レート 44.1KHz で音が出るようになってた、わはー! と、喜んだのもつかの間、翌日には音が出ないどころか、オーディオの初期化に失敗して、アプリ自体がタイムアウトで落ちるようになってしまった問題

あれやこれや、ADV の設定を弄ったり、Gradle やコードを書き直したりしてたんですが、結局のところ、PC(Mac)のサウンド入力装置の設定でした。

オーディオI/Fを指定していたため、AVD が(マイク)入力を初期化できないと仰っていた模様。
PCデフォルトの、ライン入力を指定したところ、問題なく動作しました。
分かってみれば何てことないことが原因でガックリ。

しかし、設定を変えた記憶はないんだよなぁ・・・。

【AVD】これだから【Android targetSdkVersion 23】


AVD で音が出るようになって、デバッグはかどるー、パーミッションの問題 も何とかなりそうだー。

と、喜んでいたのもつかの間、昨日、動作確認があらかた済んだので、signed APK を吐き出して、Amazon さんのアプリ・テストでOK が出たので、Android Studio を終了。
今朝になって、作業の続きを・・・と、AVD を立ち上げて、アプリを AVD で起動したら、動かなくなってた。

確か、NDK のバージョン・アップはあったものの、それ以外は弄ってないはずなのだが・・・。

Audio 関係で転げてるような気がするんだけど、原因分からず・・・。
いや、そもそも、昨日動いていたもんが、今日動かなくなる原因が分からない。

明日直ったりするもんじゃろか。

すみません、間違ってました。【Android 6 以降の Permission 問題】


というわけで、ナゼか Android 6 Marshmallow で、cocos2d-x でビルドしたアプリが起動できたり、出来なかったりした問題

どうやら、Android 6 で大きく変わったパーミッションの扱いに問題があった模様。

E libEGL : validate_display:255 error 3008 (EGL_BAD_DISPLAY) とエラーが表示されていたので、描画系の問題かと思っていたのですが、全く関係なかったという。さーせん。

要は、、Android 6 で Dangerous Permission に指定された Permission は、アプリの初回起動時に、ユーザーから能動的に許可を貰わないと起動できなくなるというお話のようです。

で、実際、どうやるのよ、てお話ですが、公式ではこんな感じで解説されてますが、なるほど、分からん! 状態で、1日ネッツ検索した結果、こちら様の解説 が分かりやすかったです。

他の解説サイトだと、Android のバージョン・チェックしてたりするんですが、最新の SDK だと、内部でバージョン・チェックしてるみたいなので、必要ないみたいです。あと、AlertDialog を使って許可を得るやり方が多かったんですが、requestPermissions() を使えば自動で表示されるようで、こちらも必要ないみたいですね。


ユーザーが許可したら、諸々、機能を初期化して使えるようにする、ってのは出来たんだけど、うっかり、すでに許可済みだった場合に、初期化を呼ぶのを忘れてハマる大ばか者。
先ほどの解説サイトの、

if (checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {

  return;
}


を、こんな感じに

if (checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager.PERMISSION_GRANTED) {

  return;
}else{
  // すでに許可されている
  // 機能の初期化など
}



って感じで良さげでした。

しかし、AVD だと、たまに動作が不安定なときがあるんだよなぁ。
不許可にしてから、設定>アプリ>自作アプリ>許可 で、パーミッションを許可してから、アプリを起動しても、ナゼか許可されてないような動作したり・・・。
電源オフ -> オンで正常な動作に戻るんだけど・・・。


Amazon の Google Cloud Message 問題 FirebeseAnalytics 付き


こちらの記事 の関連で、FirebaseAnalytics を使っていると、他にもコメント・アウトしなくちゃならない箇所があるので、備忘録。


プロジェクト・レベルの build.gradle

classpath 'com.google.gms.goog;e-services:x.x.x'



と、

アプリ・レベルの build.gradle

dependencies {
   compile 'com.google.firebase:firebase-core:x,x,x'  // この行をコメント・アウト
}

apply plugin: 'com.google.gms.google-services'  // この行をコメント・アウト



をコメント・アウト。

あと、FirebaseAnalytics を使っていると、MainActivity に下記のものがあるはずなので、これもコメント・アウト。

import com.google.firebase.analytics.FirebaseAnalytics;

private FirebaseAnalytics mAnalytcis;

mAnalytcis = FirebaseAnalytics.getInstance(this);



で、Amazon 向けのリリース版ができる、かも。



【2017/01/30 追記】

Firebase 公式サイトの実装手順では、MainActivity へのコードの埋め込み、

import com.google.firebase.analytics.FirebaseAnalytics;

private FirebaseAnalytics mAnalytcis;

mAnalytcis = FirebaseAnalytics.getInstance(this);


の記載がないので、必要ないかも知れません。

【ADV】音が出るようになった【Google APIs】


しばらくぶりに、Android Studio を起動したら、大量のアップデートが来てた。

で、これまたしばらくぶりに、ADV を使ってみたら、なんと音が出るようになっていた。

これまで、ADV で音を出そうとすると、「その設定じゃ音を出せないんだよねぇ・・・」と言われて、アプリが終了していたので、スクリーン・ショットを撮りたいときなどは、音関係のプログラムをコメント・アウトしなきゃいけなくて、面倒臭かったんだよねぇ。

ちなみに、以前のものでは、サンプリング・レートが 8,000Hz であれば音が再生できていたと思う。誰が使うのか。

Pure Data (Pd for Android) を組み込んで開発をすることが多いワタクシ、これは嬉しい。

以前、設定した ADV でアプリが起動しなかったり、音が出ない場合は、デフォルト設定で新たに作り直してやるだけで大丈夫でした。
以前の ADV は削除しちゃった、やっほーい!

起動も早くなったような気がするし、ありがたや、ありがたや。

つーことは、Android の最新バージョンはADV で、その他は Google Developer Console の「リリース前テスト」にお任せしちえばデバッグ完了ってこと?
いや、たぶん、違うと思う。

どっちにしても


黒石市の写真コンテストの騒動、ネットの悪いところが出た感じがする。

まぁ、推測でしかないけれど、市長賞が決まった後で、被写体の少女が自殺していたことが判明、市側は、善意で解釈すれば、遺族側に配慮して、悪意で解釈すれば、面倒を避けるため、賞を取り消したところ、ネット・ニュースで炎上、遺族の訴えもあり、再度、市長賞授与の運びとなった。

これまた、推測になってしまうけれど、これ、一度、取り消さずに市長賞を授与していたら、どうなっていただろうか。
これに対して、「遺族の気持ちを考えていない」と炎上しなかっただろうか。

どちらにしても、炎上してしまうのだったら、コンテスト自体を取りやめてしまう可能性もゼロではない。
まぁ、およそ芸術とは無縁の生活を送っているワタクシ、写真の善し悪しなど分かるハズもないだが、そういう状況は、あまり健全な社会とは言えないことは分かる。

今回、テレビの取材に対して、遺族が正式にコメントを出したけれども、ホントに遺族のことを考えるならば、遺族のアクションがあるまで、ネットで大騒ぎしないほうが良いのではないかと思う。

亡くなった方の笑顔の写真を見るのもツライという遺族がいないとも限らない。


ドラマ初回その9


IQ246~華麗なる事件簿~

主人公、織田裕二の役名が法門寺沙羅駆、その護衛役の刑事、土屋太凰の役名が和藤奏子は、シャーロック・ホームズ&ワトソンという分かりやすさなんだけど、執事、ディーン・フジオカの賢正って、元ネタはなんだろう?

でも、まぁ、主人公の名前を聞いたときには、おでこにバッテンの絆創膏を貼っているのかと思うよね。

内容的には、風変わりな天才、織田裕二に振り回される土屋太凰という図式をメインにした、コメディ風ミステリー。
初回は、犯人が誰だか分かっている、倒叙式でしたね。

さてさて、まぁ、内容よりも気になってしまうのが、織田裕二の役作り。
初回を見る限り、表情、所作、口調ともに、ちょっとオーバーすぎるような気も。
続けて見てれば慣れてくるだろうか。
ここが、好き嫌いの分かれ目になりそう。

この手の天才探偵だと、シャーロック・ホームズはもちろん、杉下右京、古畑任三郎など、前例も多いので、新たな探偵のキャラの模索の一つかも知れない。
どちらかといえば、ポワロに近いかも知れない。

富豪刑事みたいな感じも想像したんだけど、金に飽かせた捜査は、天才探偵という内容的にそぐわないし。
まぁ、花屋で「花粉が~」のときには、花屋の花を全部買い取って、DNA 鑑定するとか言い出さないか心配しましたが。

天才探偵登場の場合、序盤で、その推理力を見せ付けるために、短時間で事件を解決するパターンが多いのですが、このドラマでも、殺人現場に遭遇して、鮮やかな推理を披露しました。

その後、タクシーの無賃乗車で逮捕、身元調査で織田裕二のバック・ボーンが薄っすら判明して、中谷美紀監察医が入れあげるまでの流れは丁寧な作り。

普通なら、引き立て役の刑事が恐れ入って終るところ。
浅見光彦くらい特殊な設定でも、身元調査して、刑事が「こ、これは失礼しました!」のお決まりのパターン。
それはそれで、楽しいけど。

で、刑事役、真飛聖の役名が、今市種子という、そのものズバリなイマイチな名前なのは、やはり、主人公の引き立て役なんでしょうけど、あくまでライバル心は絶やさない。
しかし、真飛聖がこの手のドラマに出てくると、どうしても相棒を連想してしまう。

そして、最後の謎「M」、モリアーティ教授なんだろうけど、中谷美紀監察医、役名、森本朋美が怪しいと思うのは、制作側の思う壺っぽいなぁ。

電通の過労自殺で考えたこと


何だか、テレビでも、とても大きく取り上げられていますが、やっぱり、電通だからだろうなぁとは思う。

騒ぎになったら、労働局がすかさず強制調査。
まぁ、騒ぎになったらなのか、判決が出たからなのかは分からないけど。

20代の女性だったというのも、インパクト大きかったし。

ここからの話は、本件をきっかけに考えたことではあるけれど、本件とは関係ない話です。


昔は皆そんなもんだった、同じ労働条件でも、自殺しない人もいる、といった論調もあるようですが、まぁ、これは、犯罪が起きたときに、犯人の不幸な生い立ちを知って、同じような境遇の人もいるけど、全員が罪を犯すわけではないと言ってるようなものかな、と。

そういう見方をすれば、犯罪者に「罪を犯すほうが悪い」と言うように、「自殺するほうが悪い」と言うのはフェアではある、ように思える。
でも、犯罪者に関しては、大きな意味で「社会不安」という実害を、皆でこうむっているから、許容されるのであって、「自殺」という、個人レベルの話で、「自殺するほうが悪い」というのは、どうなんだろうとは思う。

ただ、自殺した人は被害者かと問われれば、それは違うような気がする。

その仕事が好きならば長時間残業も苦にならないという人もいるので、それなら、景気が良くなって、求人が増えて、職業選択の幅が広がれば、自殺者は減るのだろうか。
たぶん、景気が良くなると、仕事が増えて、もっと残業が多くなるのだが。


まぁ、今回のケースでは、長時間残業した仕事が報われることがなかったというところに問題があるような気がするので、長時間残業とは直接関係ない話だと思うのだ。

穴を掘っては埋める。
それも多々あることではあるけれど。