2015年2月13日金曜日

Android NDKについて

基本プログラムねたは読まれないのでどうかと思うが
覚え書きと考えてください


Ubuntu上でAndroid SDKからC言語の関数を呼ぶ必要がありNDKについて学んだ。
基本的にはこれ
http://www.kkaneko.jp/rinkou/js/andk.html

目的もなく学び続けるのは辛いのでまず
Androidのクラス(JAVA)に
String okawapos(int pos);
という関数を作り,
この関数をjavaでなくCで実装することを課題とした。
中身は何でもいいが、今回は
"Hello, World! %d okawa kouji" を返すこととする。%dはもちろんposのこと。
つまりokawapos(3)で"Hello, World! 3 okawa kouji"を返す。

まずECLIPSEで開発環境を作ることから説明する。
まずNDKをダウンロード
https://developer.android.com/tools/sdk/ndk/index.html
これを解凍してホームにおく。
これでファイル配置は
/home/kokawa2003/android-ndk-r10/build
                                                                        /doc
                                                                         .....
となる。
次に/home/kokawa2003/android-ndk-r10にパスを通す。
具体的には
/home/kokawa2003/.bashrcに
export PATH=$PATH:~/android-ndk-r10
と書く。
ここで再起動
ndk-buildが使えるのを確認。
$ ndk-build
Android NDK: Could not find application project directory !   
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.   
/home/kokawa2003/android-ndk-r10/build/core/build-local.mk:148: *** Android NDK: Aborting    .  Stop.
多分こんな結果。

パスがとおったら早速サンプルをビルドしてみる
たとえば
$ cd /home/kokawa2003/android-ndk-r10/samples/hello-jni/jni
$ ndk-build
結果はこれ
Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 3 in /home/kokawa2003/android-ndk-r10/samples/hello-jni/AndroidManifest.xml   
[armeabi-v7a] Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi-v7a/gdbserver
[armeabi-v7a] Gdbsetup       : libs/armeabi-v7a/gdb.setup
[armeabi] Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi/gdbserver
[armeabi] Gdbsetup       : libs/armeabi/gdb.setup
[x86] Gdbserver      : [x86-4.6] libs/x86/gdbserver
[x86] Gdbsetup       : libs/x86/gdb.setup
[mips] Gdbserver      : [mipsel-linux-android-4.6] libs/mips/gdbserver
[mips] Gdbsetup       : libs/mips/gdb.setup
[armeabi-v7a] Install        : libhello-jni.so => libs/armeabi-v7a/libhello-jni.so
[armeabi] Install        : libhello-jni.so => libs/armeabi/libhello-jni.so
[x86] Install        : libhello-jni.so => libs/x86/libhello-jni.so
[mips] Install        : libhello-jni.so => libs/mips/libhello-jni.so

出力は
/home/kokawa2003/android-ndk-r10/samples/hello-jni/libs/
にある。
libs/armeabi-v7a/libhello-jni.so
libs/armeabi/libhello-jni.so
libs/x86/libhello-jni.so
libs/mips/libhello-jni.so
の4ファイルあれば正解。
ここで次にANDROID SDKでビルドかECLIPSEに取り込んでビルドか
どちらかでANDOIDアプリが起動するのを確認。
表示は
Hello from JNI !  Compiled with  ABI armeabi-v7a
みたいな文字列になるハズ。(最後のarmeabi-v7a だけ環境で変わる)

ここでTIPとしてはABIという言葉についての説明
ABIとはApplication Binary Interfaceのこと
要するにABIが同じとは実行ファイルがバイナリレベルで互換である(動作する)ことを指す
この場合armeabi-v7a、armeabi、x86、mipsのCPU向けのファイルができている
この内android一般がarmeabiとなる。

さて次にjniを自作する方法
まずandroid appを作る。
app名:hello3
パッケージ名:com.example.hello3
のアプリの
クラス名: MainActivity

関数名:String okawapos(int pos);
を作るとする。

まずjniを作る。
hello3にサブフォルダjniを作る。
中身は2ファイル
hello.c
#include <string.h>
#include <jni.h>

jstring
Java_com_example_hello3_MainActivity_okawapos( JNIEnv* env, jobject thiz,jint pos )
{
    char buff[256];
    sprintf(buff,"Hello, World! %d okawa kouji\n",pos);
    return (*env)->NewStringUTF(env, buff);
}
この関数だが
jstring Java_com_example_hello3_MainActivity_okawapos( JNIEnv* env, jobject thiz,jint pos )

javaの
String okawapos(int pos);
のCの対応関数となる。
まず名前 com_example_hello3_MainActivity_okawapos
これは"パッケージ名_クラス名_関数名"の意味。 ただしパッケージの.は_に置き換える
だから
String okawapos();
なら
jstring Java_com_example_hello3_MainActivity_okawapos( JNIEnv* env, jobject thiz)
となる。次に引数は
string->jstring
int ->jint
みたいな関係で引数の最初
JNIEnv* env, jobject thiz
は固定だと考えることにする。

もうひとつのファイルは
Android.mkで中身は
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := hello
LOCAL_SRC_FILES := hello.c

include $(BUILD_SHARED_LIBRARY)

これでlibhello.soが出力される。ただしそれにはちょっと設定する必要あり

まずプロジェクト名hello3を右クリックし
Convert to a C/C++ Project (Adds C/C++ Nature)
実行、次に
Makefile プロジェクトの他のツールチェーン
を選ぶ。これで完了

さらにプロジェクト名hello3を右クリックし
propertyのメニュー
C/C++ Build ー>Builder Settingsー>build command
/home/kokawa2003/android-ndk-r10/ndk-build
さらに
C/C++ Generalー>Paths and Symbolsー>Includes->GNU C
/home/kokawa2003/workspace/Hello3/jni
/home/kokawa2003/android-ndk-r10/platforms/android-19/arch-arm/usr/include
/home/kokawa2003/android-ndk-r10/platforms/android-19/arch-mips/usr/include
/home/kokawa2003/android-ndk-r10/platforms/android-19/arch-x86/usr/include
/usr/lib/jvm/java-7-oracle/include
/home/kokawa2003/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/lib/gcc/arm-linux-androideabi/4.6/include
/home/kokawa2003/android-ndk-r10/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/lib/gcc/arm-linux-androideabi/4.6/include-fixed
と入れる

最後にjavaコード
public class MainActivity extends ActionBarActivity

  public native String  okawapos(int pos);
    static {
        System.loadLibrary("hello");
    }
   
の宣言追加

コードは例えば
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       
        TextView  tv = new TextView(this);
            tv.setText( okawapos(3) );
            setContentView(tv);       
    }

これでうまくビルドが通れば
"Hello, World! 3 okawa kouji"
が表示される

2015年2月10日火曜日

中華androidでインターネット接続する話

ある理由で中華android C1000
http://www.alibaba.com/product-detail/cheap-3G-smart-phone-C1000-MT6582_1956500136.html
を手に入れた。

これで松子で有名なOCNのSIMカードを入れてインターネットが出来ればいい感じ。
http://050plus.com/pc/050_mobileone/index.html




そこで早速購入してやってみた。
まずSIMカードを挿入するのが横でちょっと面食らった.

その後WEBで050の番号をもらった。

つぎにSIMでインターネットできるように設定する必要あり
まずWIFIでネットとつなげた後050 plusをダウンロード
https://play.google.com/store/apps/details?id=com.ntt.voip.android.com050plus&hl=ja
しかしそれだけではダメでマニュアルを真面目に読んでみると
なにかネットワークを設定する必要があった

それは設定ー>その他ー>モバイルネットワークー>アクセスポイント名
でdocomoとなっているのをOCNに変えて
APN
3g-d-2.ocn.ne.jp
ユーザー名
mobileid@ocn
パスワード
mobile
でOK


早速起動するとWIFIがON/OFFどちらでもネットと電話できるのを
確認した。これで安心して持ち出せる。

電話の音質も普通の電話と同じぐらいあった。

2015年2月8日日曜日

お名前.comにssh接続する話

ある理由でお名前.comに月々896円でサーバを借りまして、
ここにLAMPを組み立てようとしたわけだが、SSHに手間取ったそんな話

まずお名前.comでサーバを借りると、デフォルトでCENTOSでセットアップ
されたサーバーが最初にできる。これを変更することも可能だけど、面倒なので
このまま使用。まずsu,sudo使用可能ユーザーkokawa2003を作った。yum updateももちろんした。

最初の問題としてWEBからアクセスしてサーバーをコントロールするのは面倒なので
ubuntuからSSHでアクセスできるようにしたいのだが、
これ、お名前.comからダウンロードしたキーファイルで
$ssh -v -i [キーファイル]  -p 22 root@[サーバアドレス]
でやったが何回しても失敗。
Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
になってしまう。

そこで攻め方を変えてssh以外のubuntuのSSHクライアントをさがすと
puttyとfiressh(firefox addon)がみつかった。
これをつかうとどちらもSSHアクセスできるのがわかった。
がしかし、つかうのが辛い(カット&ペーストがやりづらい)。
そこでもう一度不具合Permission deniedに対処することにした。

まずrootアクセスをやめて一般アクセス(kokawa2003で)する方法をさがす。
これはあっさり見つかった。が手順が面倒
まずローカルでsshのキーを作る。私の場合
$ssh-keygen -t rsa -b 2048
で作った(引数の意味は調べてください)
これで~/sshに
id_rsa  id_rsa.pub
の2つのファイルができる。このid_rsa.pubが公開キーで
ssh-rsa ???????????????????
のような中身のファイル。これをサーバーにコピーする
具体的にはfiresshでrootログイン後
$su kokawa2003
$vi /home/kokawa2003/.ssh/authorized_keys
でファイルを開いてブラウザから
ssh-rsa ???????????????????
を貼り付ける。
puttyはどうもカット&ペーストできないらしい(少なくとも私はわからなかった)
viの使いかたの説明は勘弁してくれ。
できたら:wqで保存。

ここでfiresshとputtyでkokawa2003でログインできるのを確認
ただsshは
$ssh kokawa2003@monkeytalk.jp
でするとさらに失敗
Agent admitted failure to sign using the key.
となる
これをGoogleで調べると
$ssh-add ~/.ssh/id_rsa
で解決し、今度は
$ssh kokawa2003@monkeytalk.jp
でログインできるのを確認。

そこで早速ログインしてsuで
vi /etc/ssh/sshd_config
を編集しルートアクセス禁止にした。

このあとPHP,MYSQL,HTTPDを入れてLAMPを作るのだが
その話はPHPを5.5にしたことぐらいしか書くことがないので省略

肝はローカルのid_rsa.pubをサーバーに書き込むこと
ただviで一字も間違いなく打ち込めないのでカット&ペーストできる
クライントを一時的に見つける必要あり。

ちなみにこれ以降は
scpとかでファイルのアップもできるのを確認。


2015年1月19日月曜日

ubuntuで電子書籍を読む

電子書籍なのだが、流行ると言われ続けてたが、どうもスカぶりに終わるような
気配である。その理由はどう考えても、
ファイルが店のアプリでしか読めないフォーマットだから、
所有している感覚が持てないというところにあると思う。
だから集める気にならない。よってお金を使えない(使いたくない)。
これがPDFとかだと金を払っても集めたいのだがいろいろ難しいらしい。
EPUBってのがあるがそんなに出てるファイルがない
でも音楽も権利で縛るのはなくなりつつあるのだから、いずれ本もそうなるとおもう。
普通に買うとき金を払う。後の縛りは一切なし。
ばら撒くのは別で罰するという方向でいいのでは?と思う

まあそれは置いておくとして、
本をダウンロードして読めるサイトに青空文庫がある。
古いのしかないがとりあえず読むと面白いのでandroidで読んでいるが、
この本をubuntuで読む方法を調べた。
ポイントは縦書きでルビがつくこと。

まず青空文庫
http://www.aozora.gr.jp/
ここの本のフォーマットだが本によって違う
ZIP,XHTML,EBK,とか。

最初に考えたのがEPUBにコンバートして見ることなのだが
これが ちょっと難しいのがわかった。
まず縦書、ルビ付きで表示するのにEPUB3でなければならないが、
このコンバータが
AozoraEpub3
http://www18.atwiki.jp/hmdev/pages/21.html
ぐらいしかない
しかもEBUP3に対応したViewerが
fbreader
http://fbreader.org/
Azardi
http://azardi.infogridpacific.com/azardi-download.html
Beru
http://rschroll.github.io/beru/
しか見つからない
あとは
Chrome plugin
readium
http://readium.org/
これで満足すべきかもだが、面倒なのは拭いきれない。
まあEPUBを作っておくってのはいいことだが。(自分のライブラリを増やすという意味で)

ここで見つけたのが直接青空文庫を直で読むソフトがあるということ
青空文庫縦書リーダー
http://cpplover.blogspot.jp/2011/03/chrome-extension.html%BC/jkjlaidhndkfgjhchppdfipigaobmidh

このタイプをもっと調べるといろいろあった。
aozoraviewer
http://www.35-35.net/aozora/
えあ草紙
http://www.satokazzz.com/books/
これを使えばダイレクトにクリックで読めるので楽だし
コンバートとか考える必要がないのでいい感じ
特にえあ草紙がいい感じです。


最後にXJPを一応紹介したい。(UBUNTUで青空文庫を読む伝統的な方法だから)
http://sourceforge.jp/projects/xjp-text/releases/
もZIPの奴を読めるのを確認してます。
コンパイルするのが手間ですが、気にならない人はどうぞ。

 

2015年1月2日金曜日

virtualboxにandroid-x86 を入れてwifi接続する話

2015年最初の話題としてandroid-x86を取り上げたい。
まず知られているのか謎だがintel用のandroidをリリースしている組織がある
http://www.android-x86.org/
これがそれ。
現在最新は4.4
ここからダウンロードする
http://www.android-x86.org/download

当然intelのCPUを使っているマシンにいれて遊ぶのだが
ここではその代わりにvirtualboxに入れた

android-x86-4.4-RC1.iso
入れたのはこれ。
今見ると
android-x86-4.4-RC2.iso
ってのもあるけど私がやった時はまだなかった。

でvirtualboxへの導入はバッサリカット
説明が面倒なので。


立ち上げてみる。



悪くない感じ。
ただwi-fiと繋げてないのでそれをどうにかしたい。
virtualbox guest wifi
とかで調べるとこれはvirtualboxをインストールしたPCにusbのwifiを挿すのが一番簡単
内臓のwifiはだめでUSBのwifiってのがポイント 
例えばこれ
http://buffalo.jp/product/wireless-lan/client/wli-uc-gnm/
なぜならvirtualboxのUSBのところでそれを認識させるから。
ということでwifiの電波を受信する環境も必要
あとネットで調べるとブリッジ接続を使えってのもあったけど私の環境ではうまく行かなかった。
LANを仮想的に?wifiに変えるような方法も探したけどないらしい。

設定としては


こんな感じ
USBに項目が出ない時は
$ sudo gpasswd -a YOUR_USERNAME vboxusers
のあとで再起動
http://qiita.com/civic/items/684c4b82428feb0c4ae1

これでandroidのwifi設定でキーを入力すれば接続される。
ただ 私の場合更に接続済みでもgoogleplayが表示されないという別の
不具合があった
それについては
http://wccftech.com/fix-no-connection-retry-error-message-on-google-play-store-app/
ここにあるとおりgoogle playのキャッシュ削除が正解