AndroidでJavaFX

2014/1/10 10582hit

新年明けましておめでとうございます。
androidでJavaFXを動かしてみた時のメモです。
macでやってみました。
元記事
https://blogs.oracle.com/jfxprg/entry/javafx_on_android

前提

OS:Merverics
XCode -> Preferences -> Downloads -> Components -> CommandLineToolが済んでる
JDK8がインストールされてる
ANDROID_SDK、ANDROID_NDKがパス通ってる
gradle/antがどっかにあってパス通ってる

クロスコンパイル用にツールチェイン作成


$ mkdir -p work && cd work
$ vi make-toolchain.sh

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home
export ANDROID_SDK=$HOME/develop/tools/android-sdk
export ANDROID_NDK=$HOME/develop/tools/android-ndk-r9c
mkdir toolchain
$ANDROID_NDK/build/tools/make-standalone-toolchain.sh --platform=android-19 --install-dir=toolchain

$ sh make-toolchain.sh


フォントライブラリ/FreeTypeをビルド


$ wget http://download.savannah.gnu.org/releases/freetype/freetype-2.5.0.tar.bz2
$ tar -zxvf freetype-2.5.0.tar.bz2
$ vi make-freetype.sh

export TOOLCHAIN=~/workspace/toolchain
export PATH=$TOOLCHAIN/bin:$PATH
./configure --host=arm-linux-androideabi --prefix=$FREETYPE/install --without-png --without-zlib --enable-shared
#unix
#sed -i 's/\-version\-info \$(version_info)/-avoid-version/' builds/unix/unix-cc.mk
#mac
sed -i '.orig' 's/\-version\-info \$(version_info)/-avoid-version/' builds/unix/unix-cc.mk
make
make install DESTDIR=$(pwd)

$ sh make-freetype.sh

installでエラー。。
ldconfigはmacではエラーになるらしいので、
http://blog.bz2.jp/archives/2006/10/post-46.html

$ find . -type f -print | xargs grep -n ldconfig /dev/null

ldconfig使ってる行をコメントアウト
でいいの??

OpenJavaFXをビルド


$ hg clone https://bitbucket.org/javafxports/android-graphics-rt && cd android-graphics-rt
$ vi make-javafx.sh

JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_45.jdk/Contents/Home
JDK_HOME=$JAVA_HOME
JAVA8_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home
ANDROID_SDK=$HOME/develop/tools/android
ANDROID_NDK=$HOME/develop/tools/android-ndk-r9c
FREETYPE_DIR=$HOME/workspace/freetype-2.5.0/install
BINARY_STUB=$JAVA8_HOME/jre/lib/ext/jfxrt.jar
PATH=$JAVA_HOME/bin:$ANDROID_SDK/tools:$ANDROID_SDK/platform-tools:$ANDROID_NDK:$PATH
gradle -PANDROID_SDK=$ANDROID_SDK -PANDROID_NDK=$ANDROID_NDK -PDEBUG -PJAVA8_HOME=$JAVA8_HOME -PDALVIK_VM=true -PBINARY_STUB=$BINARY_STUB -PFREETYPE_DIR=$FREETYPE_DIR -PCOMPILE_TARGETS=dalvik $*

$ sh make-javafx.sh


JavaFXプロジェクトを作る

JavaFXやるならNetBeans!
ここはJavaFX Applicationからやってみます。


clean & build

自動生成されたdistを使用するため。てかこれしないと実行できない


run file

動作確認


ビルドしたJavaFXからAndroidプロジェクトを生成


$ gradle -PDEBUG createProject -PDIR=$HOME/workspace -PNAME=HelloAndroidWorld \
-PPACKAGE=org.firespeed.helloworld \
-PANDROID_SDK=$ANDROID_SDK \
-PJFX_SDK=$HOME/workspace/android-graphics-rt/build/dalvik-sdk -PJFX_APP=$HOME/workspace/HelloAndroidWorld/dist \
-PJFX_MAIN=com.helloworld.HelloAndroidWorl

これでresource類がインクルードされたAndroidプロジェクトが生成されます。
※「resource類がインクルードされた」これ大事

作成したJavaFXのソースをコピー

フォルダごと
ただし、上記の通りリソースはすでに入ってるのでJavaファイルのみ!

ビルド & インストール


$ ant debug -Djava.target=jsr14 -Djava.source=1.7
$ adb install -r bin/HelloAndroidWorld-debug.apk


動いた!!


ついでに

FXML版をやってみました


E/dalvikvm(20412): Could not find class 'javax.script.ScriptEngineManager', referenced from method javafx.fxml.FXMLLoader.getScriptEngineManager
W/dalvikvm(20412): VFY: unable to resolve new-instance 5596 (Ljavax/script/ScriptEngineManager;) in Ljavafx/fxml/FXMLLoader;
W/dalvikvm(20412): VFY: unable to find class referenced in signature (Ljavax/script/ScriptEngineManager;)
W/dalvikvm(20412): VFY: unable to resolve static method 48233: Ljavax/xml/stream/XMLInputFactory;.newInstance ()Ljavax/xml/stream/XMLInputFactory;
W/dalvikvm(20412): VFY: unable to resolve exception class 5604 (Ljavax/xml/stream/XMLStreamException;)
W/dalvikvm(20412): VFY: unable to find exception handler at addr 0x7b
W/dalvikvm(20412): VFY: rejected Ljavafx/fxml/FXMLLoader;.loadImpl (Ljava/io/InputStream;Ljava/lang/Class;)Ljava/lang/Object;
W/dalvikvm(20412): VFY: rejecting opcode 0x0d at 0x007b
W/dalvikvm(20412): VFY: rejected Ljavafx/fxml/FXMLLoader;.loadImpl (Ljava/io/InputStream;Ljava/lang/Class;)Ljava/lang/Object;
W/dalvikvm(20412): Verifier rejected class Ljavafx/fxml/FXMLLoader;
W/System.err(20412): Exception in Application start method
I/lens (20412): Finishing terminating
V/GLASS (20412): Shutting down
I/GLASS (20412): DeleteGlobalRef(pApplication(0x1d20022e))
V/FXActivity(20412): notify_glassShutdown
V/FXActivity native(20412): Notification queue finished
V/FXActivity(20412): FXActivityEventsLoop finished.
V/GLASS (20412): Shut down
I/Adreno200-EGLSUB( 205): <CreateImage:897>: Android Image
I/Adreno200-EGLSUB( 205): <GetImageAttributes:1106>: RGBA_8888
W/System.err(20412): java.lang.reflect.InvocationTargetException
W/System.err(20412): at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(20412): at java.lang.reflect.Method.invoke(Method.java:511)
W/System.err(20412): at javafxports.android.DalvikLauncher$1.run(DalvikLauncher.java:110)
W/System.err(20412): at java.lang.Thread.run(Thread.java:856)
W/System.err(20412): Caused by: java.lang.RuntimeException: Exception in Application start method
W/System.err(20412): at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:894)
W/System.err(20412): at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:56)
W/System.err(20412): at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:158)
W/System.err(20412): ... 1 more
W/System.err(20412): Caused by: java.lang.VerifyError: javafx/fxml/FXMLLoader
W/System.err(20412): at org.firespeed.hellojavafx.HelloJavaFX.start(HelloJavaFX.java:23)
W/System.err(20412): at com.sun.javafx.application.LauncherImpl$8.run(LauncherImpl.java:837)
W/System.err(20412): at com.sun.javafx.application.PlatformImpl$7.run(PlatformImpl.java:331)
W/System.err(20412): at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:297)
W/System.err(20412): at com.sun.javafx.application.PlatformImpl$6$1.run(PlatformImpl.java:294)
W/System.err(20412): at java.security.AccessController.doPrivileged(AccessController.java:52)
W/System.err(20412): at com.sun.javafx.application.PlatformImpl$6.run(PlatformImpl.java:294)
W/System.err(20412): at com.sun.glass.ui.lens.LensApplication$RunnableEvent.dispatch(LensApplication.java:183)
W/System.err(20412): at com.sun.glass.ui.lens.LensApplication._runLoop(LensApplication.java:870)
W/System.err(20412): at com.sun.glass.ui.lens.LensApplication.access$1800(LensApplication.java:59)
W/System.err(20412): at com.sun.glass.ui.lens.LensApplication$4.run(LensApplication.java:927)
W/System.err(20412): ... 1 more


。。。


す、すりーでいーはいけるよね!!


W/Material(19750): System can't support ConditionalFeature.SCENE3D
W/Shape3D (19750): System can't support ConditionalFeature.SCENE3D
W/PerspectiveCamera(19750): System can't support ConditionalFeature.SCENE3D
W/javafx.scene.Scene(19750): System can't support ConditionalFeature.SCENE3D


うーむ、、
今のところ2Dだけっぽいし、ScheneBuilderを使用した開発はまだなようです。
これからに期待

前:Jenkinsとgithub連携時のパスワード問題 次:UnityのiOSでParseを使用したpush notification

関連キーワード

[Android][Java][IT]

コメントを投稿する

名前URI
コメント