如何创建从 shell 启动的 Android 可执行文件?

How to create an Android executable for launch from the shell?

我正在使用带有 NDK 的 eclipse 将我的 C++ 应用程序移植到 Android。在 Linux 上,它是一个应用程序,您可以使用 shell 中的参数调用它来执行任务,不提供 GUI,它只是一个命令行界面。目前,我在 java 中添加了一个非常基本的 GUI 包装器,它封装了传递给 NDK 中移植的 C++ 代码的参数规范,但是,我还希望有一个可以在我 ssh 时调用的应用程序进入我的 android phone.

在 Android,我看到一些应用程序可以从 shell 启动。例如,从 Google Play Store 安装的 SSH Droid 除了其 GUI 之外,还有一个 shell 可调用版本。我在路径名 /data/data/berserker.android.apps.sshdroid/dropbear/ssh 下看到它,而它的 APK 位于 /data/app/berserker.android.apps.sshdroid-1.apk。对于我的 APK,我在 /data/data/com.mydomain.myapp-37.apk 中找不到可执行文件,只有目录 cachefileslib.

如何使用 Eclipse 将本机可执行二进制文件打包到应用程序的 APK 存档中?一旦出现在我的 APK 中,我如何在安装中自动提取和设置可执行权限,以便我可以通过 shell 启动它?看起来 SSH Droid 已经完成了这两件事,我也想这样做。有没有一个简单的例子来说明这是如何完成的?

我什至需要一个 apk,我能以某种方式创建一个更符合我现有 Linux 端口版本的命令行界面可执行文件吗?

如何为 shell CLI 指定参数?您是否像在 C++ 应用程序中那样使用 argcargv

对我来说,我的应用程序中不需要 eclipse 或任何 java 代码。我的应用程序是从 Linux 移植的,已经有了一组 makefile。我能够通过 NDK 的独立工具链部分使用我现有的 makefile 系统。

This answer 让我开始使用独立工具链。就我而言,这是我在从我的 Macintosh 进行交叉编译时调用它的方式,已经在 /Users/me/Development/android-ndk-r10d:

安装了 NDK
ANDROID_NDK=/Users/me/Development/android-ndk-r10d
SYSROOT=$(ANDROID_NDK)/platforms/android-19/arch-arm
${ANDROID_NDK}/build/tools/make-standalone-toolchain.sh --platform=android-19 --install-dir=${ANDROID_NDK}/myapp-android-toolchain --ndk-dir=/Users/me/Development/android-ndk-r10d --toolchain=arm-linux-androideabi-4.8 --system=darwin-x86_64

使用此设置,我启动了这样的构建:

cd ~/base/of/myapp/src/
ANDROID_NDK=/Users/me/Development/android-ndk-r10d PATH=${ANDROID_NDK}/myapp-android-toolchain/bin:$PATH make

在我修复了我正在使用的一些第三方库中交叉编译的一些配置问题后,我有了一个工作构建。接下来,我想将它安装在我的 phone:

# Push to a location with write permission (sdcard):
cd ~/base/of/myapp/bin/ # My build puts the executable here.
adb push myapp /sdcard/
# Go into phone and complete the install manually:
adb shell
su
mount -oremount,rw rootfs /system  # /vendor/bin is in /system mount.
# One time creation of /vendor/bin (that is in the PATH by default):
mkdir /vendor/bin
# Copy the myapp executable over
cp /sdcard/myapp /vendor/bin/myapp

现在,我可以从我的 phone 上的 shell 调用 myapp,就像普通的命令行界面 Linux 应用程序一样。我的原始 Linux 代码中的 argcargv 与此过程构建的 Android 中编写的一样。