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

时间:2015-04-23 15:17:47

标签: c++ shell android-ndk apk-expansion-files dropbear

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

在Android上,我看到一些应用程序可以从shell启动。例如,从Google Play商店安装的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

1 个答案:

答案 0 :(得分:0)

对我来说,我的应用程序中不需要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

在我正在使用的一些第三方库中修复了我的交叉编译的配置问题之后,我有一个工作版本。接下来,我想在手机上安装它:

# 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

现在,我可以从手机上的shell调用myapp,就像普通的命令行界面Linux应用程序一样。我原来的Linux代码中的argcargv的工作方式与此过程中的Android版本一样。