2017年03月18日

[Android] Android Studio を 1.5 から 2.3 にアップグレードしたら、ビルドエラーになる

Android Studio を 1.5 から 2.3 にアップグレードしたらビルドエラーが
出るようになりました。

その対策を備忘メモ。

OSは、MacOS Sierra 10.12.1。

Android Studio のダウンロード元:
https://developer.android.com/studio/index.html

ここから、最新版の .dmg ファイルをダウンロード。
ダブルクリックしてインストール。

アップデートはスムーズにできたのですが、作っていたプロジェクトでビルドエラーが
出るようになりました。

--------------------------------------------
Error:(1, 1) A problem occurred evaluating project ':app'.
> java.lang.UnsupportedClassVersionError: com/android/build/gradle/AppPlugin : Unsupported major.minor version 52.0
--------------------------------------------

Java JDK 1.7 → 1.8 に変更することで解消。

File->Other Settings->Default Project Structure->SDKs

↓画面の下の方に警告がでているので
スクリーンショット 2017-03-18 12.23.08.png

↓JDK1.8 に変更
スクリーンショット 2017-03-18 12.23.27.png

↓警告が消えました
スクリーンショット 2017-03-18 12.23.38.png

参考:
http://stackoverflow.com/questions/35937875/unsupported-major-minor-version-52-0-when-rendering-in-android-studio

posted by be-style at 15:08| Comment(0) | Android

2017年02月02日

[Unity] SimpleSQL(アセット)で日本語をINSERT/UPDATEできないときの対処

UnityでSQLを扱いたいときに、SimpleSQL(有料アセット)を使っています。
https://www.assetstore.unity3d.com/jp/#!/content/3845

無料の SQLiteUnityKit もあるのですが、
更新が止まっていることと、自分でカスタマイズできるものの色々と
手間がかかるしややこしいという点から、アセットを購入することにしました。

ですが、日本語をINSERTしようとしたときにエラーが出てしまいました。

"Insert" を使った場合:
-------------------------------------------
SQLiteException: Constraint
SimpleSQL.PreparedSqlLiteInsertCommand.ExecuteNonQuery (System.Object[] source)
SimpleSQL.SQLiteConnection.Insert (System.Object obj, System.String extra, System.Type objType, System.Int64& rowID)
SimpleSQL.SQLiteConnection.Insert (System.Object obj, System.Int64& rowID)
SimpleSQL.SimpleSQLManager.Insert (System.Object obj, System.Int64& rowID)
SimpleSQL.SimpleSQLManager.Insert (System.Object obj)
-------------------------------------------

"Execute" を使った場合:
-------------------------------------------
SQLiteException: unrecognized token: "'20"
SimpleSQL.SQLite3.Prepare2 (IntPtr db, System.String query)
SimpleSQL.SQLiteCommand.Prepare ()
SimpleSQL.SQLiteCommand.ExecuteNonQuery ()
SimpleSQL.SQLiteConnection.Execute (System.String query, System.Object[] args)
SimpleSQL.SimpleSQLManager.Execute (System.String query, System.Object[] args)
-------------------------------------------

サポートに問い合わせたら、SQL内で日本語を記述するところに「?」を書き、
Execute()の第2引数以降で渡せばよいと回答がありました。
フォーラムに過去のやりとりが記載されていました。

http://www.echo17.com/forum/index.php?topic=257.msg399#msg399

例)
SimpleSQL.SimpleSQLManager dbManager;
// ゲームオブジェクトにSimpleSQLManagerが適用されていること
dbManager = this.GetComponent();
string query = "INSERT INTO TEST(name) values(?)";
dbManager.Execute(query, "テスト");

これで無事、日本語を扱うことができるようになりました。
posted by be-style at 21:53| Comment(0) | Unity

2016年11月15日

[Unity] AWS Mobile SDK for Unity で、iPhoneで実行時エラー(NullReferenceException)が出る

AWSの一部のサービスをUnityから動かせるSDKが出ています。

AWS Mobile SDK for Unity:
https://docs.aws.amazon.com/mobile/sdkforunity/developerguide/

サンプルプログラムが添付されているので
これは便利だということで利用し始めました。

しかし、AWS S3 のサンプルを動かそうとしたときに
Unityエディタから動きませんでした。

Unityエディタで動かすには、

AWSConfigs.HttpClient = AWSConfigs.HttpClientOption.UnityWebRequest;

の一行が必要でした。

[参考] AWS Mobile SDK for Unityを使ってサーバーレスなアプリを開発する:
http://nil-one.com/blog/article/2016/04/14/AWS_Mobile_SDK_for_Unity/

これで安心、と思いきや、実機で実行したところ
NullReferenceException
が出てしまいました↓


NullReferenceException: A null value was found where an object instance was required.
at Amazon.Runtime.Internal.DownloadHandlerBufferWrapper..cctor () [0x00000] in :0
at Amazon.Runtime.Internal.UnityMainThreadDispatcher+d__7.MoveNext () [0x00000] in :0
at UnityEngine.SetupCoroutine.InvokeMoveNext (IEnumerator enumerator, IntPtr returnValueAddress) [0x00000] in :0
at Amazon.Runtime.Internal.UnityMainThreadDispatcher.ProcessRequests () [0x00000] in :0
at Amazon.Runtime.Internal.UnityMainThreadDispatcher.Update () [0x00000] in :0
Rethrow as TypeInitializationException: The type initializer for 'Amazon.Runtime.Internal.DownloadHandlerBufferWrapper' threw an exception.
at Amazon.Runtime.Internal.UnityMainThreadDispatcher+d__7.MoveNext () [0x00000] in :0
at UnityEngine.SetupCoroutine.InvokeMoveNext (IEnumerator enumerator, IntPtr returnValueAddress) [0x00000] in :0
at Amazon.Runtime.Internal.UnityMainThreadDispatcher.ProcessRequests () [0x00000] in :0
at Amazon.Runtime.Internal.UnityMainThreadDispatcher.Update () [0x00000] in :0
Amazon.Runtime.Internal.UnityMainThreadDispatcher:ProcessRequests()
Amazon.Runtime.Internal.UnityMainThreadDispatcher:Update()


原因は、実機で動かす時に必要な「link.xml(UnityプロジェクトのResourcesディレクトリに入れる)」
の記載が Unity5.4 から変更があったようでした。

[公式]AWS Mobile SDK for Unity セットアップの仕方:
https://docs.aws.amazon.com/mobile/sdkforunity/developerguide/setup-unity.html

公式ドキュメントにはlink.xmlは

<assembly fullname="UnityEngine">
<type fullname="UnityEngine.Experimental.Networking.UnityWebRequest" preserve="all" />
……

と記載されていますが、Unity5.4以降は「Experimental」を削除した

<assembly fullname="UnityEngine">
<type fullname="UnityEngine.Networking.UnityWebRequest" preserve="all" />
……

が正しいようです。

[参考]iOS: NullReferenceException: A null value was found where an object instance was required. #435:
https://github.com/aws/aws-sdk-net/issues/435

この修正をしたところ、実機でも無事AWS S3にファイルをアップロード/ダウンロードできるように
なりました。

公式ドキュメントを信じていたので、痛い目にあいました。
この解決方法を見つけた人って凄いなー。
posted by be-style at 08:00| Comment(0) | Unity