我正在 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
问题解决了。将 customRequestPermissions 替换为 requestPermissions