从本机c代码执行Android应用程序

时间:2014-04-03 08:56:00

标签: android c android-ndk

继续我之前的question,我成功地从Android应用程序执行了一个进程。现在我可以看到两个我喜欢的过程,它们都可以运行。现在我需要从本机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);

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

即使按execl执行fork命令也没有帮助。

if (!fork()) {
    execl...
}
你能告诉我某种线索吗? 感谢。

更新:我已经设法将标准输出打印到Android日志,我得到了错误

  

"执行格式错误"

来自execl方法的

消息。有人知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:1)

也许您可以从Android / Java / VM范围编写此内容,并使用NDK& amp ;;从本机代码调用它。 JNI(Java Native Interface)?

示例:

来自您的应用:

class MyActivity extends Activity {

     public native int nativeMethodName();

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

原生:

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);
}

希望有帮助的人。

答案 1 :(得分:0)

印刷的错误闻起来像许可问题。

您是否尝试从SD卡运行该应用程序?默认情况下,SD卡在没有执行权限的情况下安装,您需要重新安装它。