事象の水平線

横を無理やり伸ばしたので、デザインがおかしいけど、気にしない。完璧に時代に取り残されたHTMLをいまさらいじるのがめんどくさい。個人的ブックマーク代わりなメモ書きブログ。

JNI と SQLcipher の共存』の続き。
というか、『armeabi-v7a と x86 についてはどうするか』を調べたよ。というだけです。

Application.mk というのが必要らしい
中身は以下の一行のみ
APP_ABI := armeabi armeabi-v7a x86
APP_ABI := all
としたら
Android NDK: Check that jni/external/arm64-v8a/libdatabase_sqlcipher.so exists or that its path is correct
とかいわれた。
sqlcipherの中に無かったので。



場所はJNI配下で。
applicationmk.png


Android.mkを以下のような感じにする。

include $(CLEAR_VARS)
LOCAL_MODULE := OwnJNISource
LOCAL_SRC_FILES := OwnJNISource.cpp
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := libdatabase_sqlcipher
LOCAL_SRC_FILES := external/$(TARGET_ARCH_ABI)/$(LOCAL_MODULE)$(TARGET_SONAME_EXTENSION)
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := libsqlcipher_android
LOCAL_SRC_FILES := external/$(TARGET_ARCH_ABI)/$(LOCAL_MODULE)$(TARGET_SONAME_EXTENSION)
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := libstlport_shared
LOCAL_SRC_FILES := external/$(TARGET_ARCH_ABI)/$(LOCAL_MODULE)$(TARGET_SONAME_EXTENSION)
include $(PREBUILT_SHARED_LIBRARY)

らしいです。
どうやら、$(...)というのが変数みたいなもんらしいです。
てか、端末一個しかないんでいいのかよくわかってないんですけど・・・・
まー公式のドキュメント読め。と;;;

詳しい説明は以下参照
Android NDK の使用とapkファイルへの入れ方
.[ Android ] 自分でコンパイルした既存のビルド済みの複数の共有ライブラリ(lib***.so)を使う方法。 Android.mk の設定が必要
複数ターゲットのプレビルドの共有ライブラリをリンクしたい | 車輪の再発見みたいな?
帰ってきたネコブログ » Application.mk
穀風: Android NDK でデフォルトディレクトリを jni 以外にする方法

PageTop
再度javahでヘッダファイルを作り直す事になって、以前うまくいったので参考にしたHPを見ながらやっていたら、なぜか今回は2時間もはまったのでメモ。

C:\eclipse_work\Test>javah -o jni/Test.hpp -classpath "bin/classes;C:\adt-bundle-windows-x86_64-20140702\sdk\platforms\android-20\data\layoutlib.jar" com.test.NativeCall


<<参考>>
わかりやすいAndroid NDK導入手順 2014年版
Cygwin を使わない Android NDK 開発環境のインストールと使い方

PageTop
SQLcipher はAndroidでSQLiteをAES暗号化するナイスなライブラリ
BSDライセンスっぽいので商用でも安心して使えそう。

SQLcipherの使い方はググれば簡単に素敵な記事が見つかるので省略。

同様にセキュリティ関連でJNIを一緒に使おうとして数時間ハマッタので共存させるメモ。

簡潔に答えのみを
/jni/以下に適当なフォルダ(今回はexternal/armeabi/)を作りsqlcipherのlibsに入れるべきファイルを入れる。
sqlcipher.png

Android.mkを以下のような感じにする。

include $(CLEAR_VARS)
LOCAL_MODULE := OwnJNISource
LOCAL_SRC_FILES := OwnJNISource.cpp
include $(BUILD_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := database_sqlcipher
LOCAL_SRC_FILES := external/armeabi/libdatabase_sqlcipher.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := sqlcipher_android
LOCAL_SRC_FILES := external/armeabi/libsqlcipher_android.so
include $(PREBUILT_SHARED_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := stlport_shared
LOCAL_SRC_FILES := external/armeabi/libstlport_shared.so
include $(PREBUILT_SHARED_LIBRARY)

以上でOK

説明としては、JNIで.soをビルドする時に他の.soを消してしまうので、既存の.soを別ディレクトリからコピーするようにする。らしい。
armeabi-v7a と x86 についてはどうするかは調べてないです。
→調べてみた。『JNI と SQLcipher の共存    と複数ターゲット

詳しい説明は以下参照
Android NDK の使用とapkファイルへの入れ方
.[ Android ] 自分でコンパイルした既存のビルド済みの複数の共有ライブラリ(lib***.so)を使う方法。 Android.mk の設定が必要

PageTop
EclipseでAndroid SDK を更新したら勝手にできるようになったappcompat_v7

Android 4.xのActionBarに関係するらしいけど、全く使わないのでappcompat_v7_xを消して以前のActivityでプロジェクトを作る個人的メモ。
(多国語対応の/res/values/string以外のリソースxmlは使わずソースで書く派なのであしからず)

通常通り
ファイル>新規>Android アプリケーション・プロジェクト
からプロジェクトを作る。

appcompat_v7_2とか出来てるから
右クリックで削除
ディスク上からプロジェクト・コンテンツを削除 (元に戻せません) にチェック

MainActivity.javaを開き
public class MainActivity extends ActionBarActivity {
のActionBarActivityをただのActivityにする

Activityの赤下線にカーソルを持って行き
'Activity'をインポートします(android.app) をクリック
赤線のついてるimportは削除
onCreateの中のsuper以外は削除
onCreate以外のメソッドは削除

/res/values/styles.xmlの
Theme.AppCompat.Light → android:Theme.Light
に変更
それだけではまだ赤バツなので
ctrl-A ctrl-x ctrl-v
(全部選んでカットしてペースト これで直る。多分Eclipseのバグ プロジェクト>クリーンでも多分直る)

/res/values-v11
/res/values-v14
/res/values-w820dp

とかとか削除

/res/menu/main.xml
削除

あとは、デバッグボタンを押すとか、プロジェクト>クリーンとかで 赤バツ半全部消える はず。

PageTop
前置きは省略で、自分用やり方メモ。(基本、他サイト様のパクリ)

1:apkの取得
ブラウザ上でgooglePlayを開き取得したいもののページへ行く
http://apps.evozi.com/apk-downloader/へ行く
先ほど開いた取得したいもののアドレスを打ち込んでダウンロード

2:apkの解凍
apkは7-zipで固められているらしいので適当なアーカイバで解凍する

3:バイナリXMLを読む
xmlはバイナリになっているらしいのでツールを使いコマンドプロンプトにテキストとして表示させる
ツール:android4me
リンクからAXMLPrinter2.jarをダウンロード
コマンドラインに以下のコマンドで表示される(java環境必須)

> java -jar AXMLPrinter2.jar AndroidManifest.xml
> java -jar AXMLPrinter2.jar res/layout/main.xml


とかとか

ファイルにするにはコマンドプロンプト上で右クリックすべて選択 → Enter(コピー) → テキストエディタに貼り付け保存
※AXMLPrinter2のソースも公開されているようなので自分で何とかすればファイル化とかもできるのかもしれない。中身見てないからやってない。

4:クラスファイルを変換
ツールを使いclasses.dexを.classに変換
ツール:dex2jar
なにやらいっぱいあるバッチファイルとシェルファイルの中からdex2jar.batを使用(windows)
コマンドラインで以下のコマンドで変換

> <dex2jar.batのパス> <classes.dexのパス>
例)> C:\dex2jar-0.0.9.15\dex2jar.bat C:\hogehoge\classes.dex


うまくいくとclasses.dexと同じ階層にclasses_dex2jar.jarが出来る
→ これをさらに(普通の)zip解凍

5:.classを.javaへ変換
ツールを使い.javaファイルへ変換
ツール:jad
Jad 1.5.8g for Windows 9x/NT/2000 on Intel platformをダウンロード → 解凍
コマンドプロンプトで以下のコマンドで変換

> <jad.exeのパス> -8 -d <出力パス> -s .java -r <.classファイルパス>
例)> C:\jad158g.win\jad.exe -8 -d C:\out -s .java -r C:\hoge\**\*.class



以下、個人用蛇足
6:eclipseで見れるようにする
いろいろと理解が足りないせいか、そのままではインポートできないので、読み出したAndroidManifest.xmlを参考にカラのプロジェクトを作る
パッケージ名をマニフェストにあわせておく方が後で楽。

一度、エクリプスで作ったカラのプロジェクトを他の場所にコピーし、srcの中身を5で変換した.javaファイルに置き換える

エクリプスでカラのプロジェクトは一旦ディスク上から削除し、中身を入れ替えたプロジェクトの方をインポートする

プロガードを使うとそうなるのかわからないけど、gotoとかいっぱいでエラーが大量に出てるが、一応エクリプスでコードを追える。

javaではgotoの概念が無いと思っていた(実際使えない。みたい。)が、一応予約語になっているらしくエクリプス上では他の制御文と同様の色つき太字で表示された。

<<参考>>
PlayストアからAndroidのapkを直接ダウンロードできる「APK Downloader」(2013年版)
Androidアプリをリバースエンジニアリングする方法
Android:Windowsでapkを逆コンパイルする方法

PageTop