android - 从 native c 代码执行 Android 应用程序

标签 android c android-ndk

继续我之前的 question ,我成功地从 Android 应用程序执行了一个进程。现在我可以看到我想要的两个进程,它们都已启动并正在运行。现在我需要从 native C 代码执行 Android 应用程序。

找到了类似的问题(12),但以下解决方案对我不起作用。

1. execl("/system/bin/sh", "sh", "-c", "am start -a android.intent.action.MAIN -n   com.android.browser/.BrowserActivity", (char *)NULL);

2. execl("/system/bin/am", "start", "-a", "android.intent.action.MAIN",
                 "-n", "com.android.settings/.Settings", (char *)NULL);

以上所有行都没有执行任何操作。

即使按如下方式使用 fork 执行 execl 命令也无济于事。

if (!fork()) {
    execl...
}

你能给我一些线索吗? 谢谢。

更新:我已经设法将 stdout 打印到 Android 日志,我得到了 errno

"Exec format error"

来自 execl 方法的消息。有人知道我该如何解决这个问题吗?

最佳答案

也许您可以从 Android/Java/VM 范围编写此代码,然后使用 NDK 和 JNI(Java native 接口(interface))从 native 代码调用它?

示例:

来自您的应用:

class MyActivity extends Activity {

     public native int nativeMethodName();

     public void launchSomeAppMethod() {
         // launch some app
         Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage("com.package.someapp");
         startActivity(LaunchIntent);
     }
 }

native :

jint Java_com_yourpackage_appname_MyActivity_nativeMethodName(JNIEnv* env, jobject thiz) {
            //....
            // do your native work here
            // ...

            // call your obj instance that can launch another app
            jclass cls = (*env)->GetObjectClass(env, thiz);
            jmethodID method = (*env)->GetMethodID(env, cls, "launchSomeAppMethod", "()V");
            (*env)->CallVoidMethod(env, thiz, method);
}

希望对你有帮助。

关于android - 从 native c 代码执行 Android 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22832560/

相关文章:

Android 图片分享到 ImageShack 网站

c++ - 在 arm-linux-androideabi-gcc 上使用 c/c++ 宏对 char '#' 进行字符串化

android - 使用 OpenSL ES 在 Android 中录制 native 音频

android - Android 上 USB 设备的 Linux 文件权限

Android StrictMode 和堆转储

android - Retrofit RxAndroid 为 api 调用制作包装器

java - 未连接适配器;跳过布局跳过 1 到 2 帧

c - 在 C 中使用 strtok 解析输入

c - 定义函数宏

使用 CreateFile(..) 打开 COM 端口