为什么我的 Java 类方法没有从本机代码调用? JNI、NDK/SDK

问题描述 投票:0回答:1

我正在 Android Studio 中开发一个应用程序 NDK/SDK,并希望 Android 在运行我的应用程序时显示写入权限菜单,以便用户可以激活它。但我的 Java 类方法(MainActivity.java)没有从本机代码(android_main.cpp)中调用。

AndroidManifest.xml:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

android_main.cpp:

    void callJavaRequestPermissions(struct android_app* app) {
    JNIEnv* env = nullptr;
    app->activity->vm->AttachCurrentThread(&env, nullptr);

    jclass activityClass = env->GetObjectClass(app->activity->clazz);

    if (activityClass != nullptr) {
        jmethodID customRequestMethod = env->GetMethodID(activityClass, "customRequestPermissions",                                                    "([Ljava/lang/String;I)V");

        if (customRequestMethod != nullptr) {
            jobjectArray permissions = env->NewObjectArray(1, env->FindClass("java/lang/String"), nullptr);
            jstring permission = env->NewStringUTF("android.permission.WRITE_EXTERNAL_STORAGE");
            env->SetObjectArrayElement(permissions, 0, permission);

            env->CallVoidMethod(app->activity->clazz, customRequestMethod, permissions, 1);

            env->DeleteLocalRef(permission);
            env->DeleteLocalRef(permissions);
        } else {
            // Handle the case when customRequestMethod is NULL
        }
    } else {
        // Handle the case when activityClass is NULL
    }

    app->activity->vm->DetachCurrentThread();
}


void android_main(struct android_app* app) {
    char name[ PATH ], str[ PATH ];
    FILE *fp;
    unsigned int size;

    // JNI acts as a bridge between the Java and native code.
    callJavaRequestPermissions(app);
}

MainActivity.java:

package com.google.sample.simcode;

import android.Manifest;
import android.app.NativeActivity;
import android.content.pm.PackageManager;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.core.app.ActivityCompat;

public class MainActivity extends NativeActivity {

private static final int REQUEST_CODE = 101;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

public void customRequestPermissions(String[] permissions, int requestCode) {
    ActivityCompat.requestPermissions(this, permissions, requestCode);
}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    // Handle the permission request result if needed
}
}

我在应用程序启动时、在任何本机代码之前仅调用一次 callJavaRequestPermissions(app),并仔细检查类路径和包名称,无需调试和日志,但在运行 jmethodID customRequestMethod = env->GetMethodID(activityClass , "customRequestPermissions", "([Ljava/lang/String;I)V");我有 customRequestMethod = NULL

android-ndk java-native-interface user-permissions
1个回答
0
投票

问题解决了。将 customRequestPermissions 替换为 requestPermissions

© www.soinside.com 2019 - 2024. All rights reserved.