D on android and d_android
Jan Hönig
hrominium at gmail.com
Tue Apr 7 14:56:09 UTC 2020
On Tuesday, 7 April 2020 at 14:51:15 UTC, H. S. Teoh wrote:
> On Tue, Apr 07, 2020 at 12:43:20PM +0000, Adam D. Ruppe via
> Digitalmars-d-learn wrote:
>> On Monday, 6 April 2020 at 08:38:03 UTC, Jan Hönig wrote:
>> > Is there some "Hello World!" example for D on Android?
> [...]
>> > However there is just so much to know.
>> > It is really overwhelming.
>>
>> no kidding, I spent several weekends just trying to understand
>> the setup and build process. And I still basically don't
>> really know, which is why my thing there builds the D code
>> externally and copies the files where gradle can find them
>> instead of actually changing the gradle config.
>
> I managed to build APKs without Gradle (yes, I'm crazy like
> that). There are several steps, and you do need some tools from
> the Android SDK/NDK, namely aapt, apksigner, dx (called
> dalvik-exchange on some distros), zipalign, and a Java 1.7
> compiler (the last time I checked; maybe they support 1.8 now,
> I don't know).
>
> I haven't tried a native app so far, so the way I set it up is
> to create a dummy Java wrapper that contains main() that calls
> native methods that are implemented in D. You can use Adam's
> jni.d to generate implementations for your native methods.
>
> Steps:
>
> 1) Follow LDC wiki to build an Android cross-compiler and
> cross-compiled
> LDC libraries (this may already be prepackaged with the
> latest LDC
> releases). Most important thing you need is the path to the
> droid32
> or droid64 directories containing the libraries
> libdruntime-ldc.a,
> libphobos2-ldc.a, libdruntime-ldc-debug.a,
> libphobos2-ldc-debug.a.
>
> DROID32_PATH=/usr/src/d/android/droid32/lib # for example
>
> 2) Generate R.java:
>
> TARGET_API_LEVEL=23 # for example
> /usr/bin/aapt package -f -m -M AndroidManifest.xml -S res -I
> ${PATH_TO_ANDROID_SDK}/platforms/android-${TARGET_API_LEVEL}/android.jar -J ${PATH_TO_JAVA_SOURCE_CODE}
>
> 3) Compile Java sources:
>
> /usr/bin/javac -source 1.7 -target 1.7 -bootclasspath
> ${PATH_TO_ANDROID_SDK}/platforms/android-${TARGET_API_LEVEL}/android.jar -d obj -sourcepath src ${JAVA_SOURCE_FILES (including R.java)}
>
> 4) Generate classes.dex (on some systems dalvik-exchange might
> be called
> simply 'dx'):
>
> /usr/bin/dalvik-exchange --dex --output=classes.dex
> ${PATH_TO_OBJ_DIR}
>
> 5) Setup linker config file (for optimizing apk size):
>
> LINKER_VERSION_FILE=lib${YOUR_APP_NAME}.version
> cat > $LINKER_VERSION_FILE
> LIBGAME_1.0 {
> global:
> Java_*;
> local:
> *;
> };
>
> 6) Cross-compile D code with LDC:
>
> ${PATH_TO_LDC}/bin/ldmd2 -c
> -mtriple=armv7-none-linux-androideabi -mcpu=cortex-a8
> -L-L${DROID32_PATH}/lib -Xcc=-fpie -Xcc=-pie
> -Xcc=--sysroot=${PATH_TO_ANDROID_NDK}/platforms/android-${TARGET_API_LEVEL}/arch-arm -Xcc=-fuse-ld=bfd -Xcc=-gcc-toolchain -Xcc=${PATH_TO_ANDROID_NDK}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 -Xcc=-target -Xcc=armv7-none-linux-androideabi -O4 -inline -Isrc/d -od${PATH_TO_OBJ_DIR} ${D_SOURCE_FILES}
> ${PATH_TO_ANDROID_NDK}/toolchains/llvm/prebuilt/linux-x86_64/bin/clang -Wl,-soname,lib${YOUR_APP_NAME}.so -shared -Wl,--gc-sections -Wl,--version-script=${LINKER_VERSION_FILE} -llog -landroid -lEGL -lGLESv2 --sysroot=${PATH_TO_ANDROID_NDK}/platforms/android-${TARGET_API_LEVEL}/arch-arm -fuse-ld=bfd -gcc-toolchain ${PATH_TO_ANDROID_NDK}/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64 -target armv7-none-linux-androideabi ${D_OBJECT_FILES} ${DROID32_PATH}/lib/libphobos2-ldc.a ${DROID32_PATH}/lib/libdruntime-ldc.a -o lib/armeabi-v7a/lib${YOUR_APP_NAME}.so
>
> 7) Create unaligned APK:
> /usr/bin/aapt package -f -m -M AndroidManifest.xml -S res -I
> ${PATH_TO_ANDROID_SDK}/platforms/android-${TARGET_API_LEVEL}/android.jar -F bin/${YOUR_APP_NAME}.unaligned.apk
> /usr/bin/aapt add bin/${YOUR_APP_NAME}.unaligned.apk
> classes.dex
> /usr/bin/aapt add bin/${YOUR_APP_NAME}.unaligned.apk
> lib/armeabi-v7a/lib${YOUR_APP_NAME}.so
>
> 8) Sign the APK:
> /usr/bin/apksigner sign --ks-pass
> file:${YOUR_SIGNING_KEY_PASSWORD_FILE} --ks
> ${YOUR_SIGNING_KEY_STORE_FILE}
> bin/${YOUR_APP_NAME}.unaligned.apk
>
> 9) Align the APK:
> /usr/bin/zipalign -f 4 bin/${YOUR_APP_NAME}.unaligned.apk
> bin/${YOUR_APP_NAME}.apk
>
> 10) Copy bin/${YOUR_APP_NAME}.apk to your device and install it.
>
>
> T
Thanks for the effort. I will try the "easy" way frist :D
More information about the Digitalmars-d-learn
mailing list