ラベル eclipse の投稿を表示しています。 すべての投稿を表示
ラベル eclipse の投稿を表示しています。 すべての投稿を表示

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"
が表示される

2014年9月15日月曜日

gtkをWindowsでコンパイル

少々理由あってlinuxのGTKアプリをWindows で動くように変換した。
以下はその備忘録

Qtなら簡単にWindowsとLinuxでやりとりできるのを知ってたが、同じことを
GTKでできるかを調べるはめに追い込まれた。
そのアプリの名前はgerbv(http://sourceforge.jp/projects/sfnet_gerbv/
基板のガーバーデータ(RX-274X)を見るアプリだ。

これ自体はapt get source gerbvでソースがおとせるので割合簡単にmakeできる。
そしてそのソースを例えばeclipseに突っ込んでビルドするのも難しくない。
全部ソースを適当なeclipseのプロジェクトにぶち込んで、makeの引数から
-Iのインクルード、-Dのマクロ、link をそのままコピーしてeclipseに入れたらあっさりビルドできた。
あとちょっとソースはいじった。

でこれをWindowsで動かすにはどうすればいいのかだが、
まずVisual Studioで動かすのは難しいのでこれは早々と諦めた。

つぎにこのREADMEに
- Go to http://www.gtk.org and follow links to gtk for win32.

- Download all of the runtime, developer, and source .zip, .tar.gz, and
  .bz2  files for glib, atk, pango, gtk+, gettext, libiconv, pkg-config,
  and the others there.  Save all of these files to ~/gtk_win32_downloads.

- In cygwin,

  cd /path/to/gerbv/sources

  and run

  ./win32/extract_gtk_win32.
こうあるのでまじめにダウンロードしてやってみたがこれも難しいのか成功しない。

結局頼ったのがlinuxのeclipseでできたから、Windowsでもmingw+eclipse+CDTの環境があるから、これにGTKを付けられないか?ってことだがこれは成功する。
http://adeigjl.blogspot.jp/2011/06/gtk-helloworld.html
ここに詳しい。
まず注意することとしてGTKを最初にダウンロードするがWindows64bitの人は64bit版を
ダウンロードすること。しないとあとで謎のリンクエラーが起こってしばらく悩む
またGTK3でなくてGTK2なのにも注意 (これはアプリがGTK2を使うから)
32bit
http://ftp.gnome.org/pub/gnome/binaries/win32/gtk+/2.24/gtk+-bundle_2.24.10-20120208_win32.zip
64bit
http://ftp.gnome.org/pub/gnome/binaries/win64/gtk+/2.22/gtk+-bundle_2.22.1-20101229_win64.zip
で適当なところ
c:\opt\gtk
とかに解凍してc:\opt\gtk\binにパスを通す。

cmd.exeで
>pkg-config --cflags gtk+-2.0
>gtk-demo

でアプリが立ち上がったのを確認 
 
このあとはeclipseの作業
①適当なプロジェクトを作成
②ソースを書く
  http://developer.gnome.org/gtk-tutorial/stable/c39.html#SEC-HELLOWORLD
③ コマンドプロンプトにて以下を実行
>pkg-config --cflags gtk+-2.0 > a.txt
>pkg-config --libs gtk+-2.0 > b.txt
わたしの場合
a.txt
-mms-bitfields -IC:/opt/gtk/include/gtk-2.0 -IC:/opt/gtk/lib/gtk-2.0/include -IC:/opt/gtk/include/atk-1.0 -IC:/opt/gtk/include/cairo -IC:/opt/gtk/include/gdk-pixbuf-2.0 -IC:/opt/gtk/include/pango-1.0 -IC:/opt/gtk/include/glib-2.0 -IC:/opt/gtk/lib/glib-2.0/include -IC:/opt/gtk/include -IC:/opt/gtk/include/freetype2 -IC:/opt/gtk/include/libpng14 
 

b.txt
-LC:/opt/gtk/lib -lgtk-win32-2.0 -lgdk-win32-2.0 -latk-1.0 -lgio-2.0 -lpangowin32-1.0 -lgdi32 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lpango-1.0 -lcairo -lgobject-2.0 -lgmodule-2.0 -lgthread-2.0 -lglib-2.0 -lintl 
 

だった。
コマンドでリダイレクトしたテキストファイルの内容をBuild Variablesに追加
(プロジェクトのプロパティ > C/C++ Build > Build Variables)。最初のコマンドの内容を
gtk-inc,次のコマンドの内容をgtk-libとでもしておく。


プロジェクトのプロパティ > C/C++ Build > Settings --- Tool Settingタブ
GCC C++ Compiler > Commandline pattern と
MinGW C++ Linker > Commandline pattern の末尾に ${gtk-inc}と${gtk-lib}を追加。


⑥ビルドしてみる。
うまくいいってたらビルドできる。
 
こんなのが出るはず。


本物も基本的には同じであとconfig.hのフラグをしばらくいじったらあっさり出来た。
あと gcc の-Dの引数を#defineに変更してソースに書いた。なぜかmingWではgcc の-D引数に""つき文字列がうまく渡せないので。
最後にLINUXとWindwsのeclipseのソースを置いておく
windows http://1drv.ms/1qOyAeM 
linux   http://1drv.ms/1qOy1BG

まあちょっと難しいがおもしろかった。でこれからが仕事の土台が出来たので実際に使うアプリの作成にとりかかるってことになる。このためにeclipseを使えるようにしたのだった。
 

2014年8月13日水曜日

ubuntuにmysqlのDBを作ってそれにandroidからアクセス


色々ごねた。android_studioでやってたらわけわからなくなって
さらにeclipseでandroidのjavaでやってさらにわからなくなって
最終的にeclipseでlinuxのjavaで動作確認
そこからandroid_studioに至った。
基本的にバカだから手間がかかるのだった。
eclipseとかjavaとかmysqlとかいろいろ忘れてた。
androidプログラムも忘れてたし。
もはやSEとは言えないかもしれん。

話に入る前に諸元を確認
ubuntu 14.04
mysql  5.5.38-0ubuntu0.14.04.1

まず最初にJdbcのドライバーのダウンロード
http://dev.mysql.com/downloads/connector/j/
ここに行くとファイルダウンロードできます
Microsoft WindowsとPlatform Independentの二択だが
当然Platform Independentを選ぶ
私の場合は
mysql-connector-java-5.1.32.zip
だった。そして解凍してこのなかにある
mysql-connector-java-5.1.32-bin.jar
をとりだす。(ほかのファイルはいらない)

このドライバーの認識のさせ方は
[eclipse]
①プロジェクトのどこかにコピー
 具体的にいうとパッケージエクスプローラのプロジェクトの中
 のどこか(libsがよいと思う)にドラッグしてファイルを突っ込む
 ことを指す
②ビルドパス設定
 パッケージエクスプローラのプロジェクト名のフォルダで右クリックするとメニューの
 一番最後に"Properties"という項目があるからそれをクリック
 Librariesのところでadd jar からコピーしたファイルを入れる
[android studio]
①プロジェクトのどこかにコピー
 具体的にいうとプロジェクトのビューのプロジェクトの中
 のどこか(libsがよいと思う)にドラッグしてファイルを突っ込む
 ことを指す
②ファイル設定
 プロジェクトのビューのプロジェクトの名前で右クリックするとメニューに
 "Open Module Settings"という項目があるからそれをクリック
  Dependenciesのところで+のFile dependenciesからコピーしたファイルを入れる

次にmysqlサーバだが
①sudo vi /etc/mysql/my.cnf
で50行目
bind-address           = 127.0.0.1
をコメントアウト(#を先頭に追加)して
#bind-address           = 127.0.0.1
にする
あとうるさく言うと
GRANT ALL ON sampledb.* TO pgtop@'%' IDENTIFIED BY '12345';
とかもやったがこれは振り返ると不要だったかも
②DB作成、ユーザー作成
  DBなので当然

最後にandroidのソースの書き方だが
①AndroidManifest.xmlに

 追加
②コードを書く
 重要なことはJDBCアクセスの部分はインターネット経由なのでメインスレッドにかかない
 こと

以下全文