gpt4 book ai didi

android - 如何使用c/c++代码在android系统下安装apk?

转载 作者:太空狗 更新时间:2023-10-29 14:11:42 25 4
gpt4 key购买 nike

现在我正在编写一个在 android(linux) 下运行的应用程序,我遇到一个问题:我使用 libcurl 在我的代码中下载一个 apk,并使用 execvp 来安装它?错误码为-1(perror print: Permission denied),如下所示:

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 中? (无论我不知道什么)?

最佳答案

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) -> Java_com_example_test_MainActivity_installFromJNI(Native) -> InstallCallback(Java)。

关于android - 如何使用c/c++代码在android系统下安装apk?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27354100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com