2014-12-08 26 views
3

現在我正在編寫一個在android(linux)下運行的應用程序,我遇到了一個問題:我使用libcurl在我的代碼中下載了一個apk,並使用execvp來安裝它?錯誤代碼爲-1(PERROR打印:權限被拒絕),如下列:如何在android系統下使用c/C++代碼安裝apk?

the error is: Permission denied 

下載文件權限:

----rwxr-x system sdcard_rw 3240080 2014-12-08 07:48 barcode.apk 

示例代碼:

curl_easy_reset(curl); 
    FILE *fp; 
    fp = fopen("/sdcard/download/barcode.apk", "wb+"); 
    curl_easy_setopt(curl, CURLOPT_URL, "http://apk.r1.market.hiapk.com/data/upload/apkres/2014/9_22/21/com.youba.barcode_093937.apk"); 
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_apk_file); 

    curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); 

    returnvalue = curl_easy_perform(curl); 

    if(CURLE_OK != returnvalue) 
    { 
     /* we failed */ 
     fprintf(stderr, "curl told us %d\n", returnvalue); 
    } 
    else 
    { 
     int value = execvp("/sdcard/download/barcode.apk", NULL); 
     if (value == -1) 
     { 
      perror("the error is"); 
     } 
    } 

我怎麼能安裝apk在這個應用程序,我發現類似的問題,都在Java? (無論我不知道它)?

回答

1

Android程序包不是二進制可執行程序,即使您在其上添加執行權限,也不能通過exec系統調用執行。

您可以在Java中創建回調,然後從JNI調用它來安裝下載的包。我使用示例文件/data/local/tmp/test.apk,您可以使用您的實現中的下載文件進行替換。

JNI方法

void __attribute__((visibility("default"))) Java_com_example_test_MainActivity_installFromJNI(
    JNIEnv* env, jobject obj) { 

__android_log_print(ANDROID_LOG_DEBUG, "test", "jni call"); 
jclass clzMainActivity = env->GetObjectClass(obj); 
jclass clzFile = env->FindClass("java/io/File"); 

if (env->ExceptionCheck()) { 
    __android_log_print(ANDROID_LOG_DEBUG, "test", "find class error"); 
    env->ExceptionDescribe(); 
} 

if (env->ExceptionCheck()) { 
    __android_log_print(ANDROID_LOG_DEBUG, "test", "get method error"); 
    env->ExceptionDescribe(); 
} 

jobject filePath = env->NewStringUTF("/data/local/tmp/test.apk"); 
jobject file = env->NewObject(clzFile, 
     env->GetMethodID(clzFile, "<init>", 
       "(Ljava/lang/String;)V"), filePath); 
if (env->ExceptionCheck()) { 
    env->ExceptionDescribe(); 
    __android_log_print(ANDROID_LOG_DEBUG, "test", 
      "create file object error"); 
} 

jmethodID installCallback = env->GetMethodID(clzMainActivity, 
     "installCallback", "(Ljava/io/File;)V"); 

env->CallVoidMethod(obj, installCallback, file); 

__android_log_print(ANDROID_LOG_DEBUG, "test", "jni call end"); 
} 

Java方法

public void installCallback(File file) { 
    Intent intent = new Intent(Intent.ACTION_VIEW); 
    intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive"); 
    startActivity(intent); 
} 

private native void installFromJNI(); 

函數調用鏈是,installFromJNI(爪哇) - >Java_com_example_test_MainActivity_installFromJNI(母語) - >InstallCallback(爪哇)。