1. 问题出现的原因

初学JNI,跟着视频学敲代码。由于教学用的Eclipse,我用的AS。所以难免会遇到很多的坑,并且教学时用的是虚拟器,所以开发环境和运行环境的不同也就导致了诸多初学者在不断的踩坑。

extern "C"
JNIEXPORT jstring JNICALL
Java_com_example_firstnativeapplication_MainActivity_writeFileFromJNI(JNIEnv *env, jobject thiz,
                                                                      jstring file_path) {

    //1.接收传递的字符串
    const char* cfile_path=(*env).GetStringUTFChars(file_path,NULL);

    //2.判断文件路径是否为空
    if(cfile_path!=NULL){
        LOGE("收到java传来的路径 %s",cfile_path);
    }

    //3.打开文件

    FILE *file = fopen(cfile_path, "a+");
    if(file!=NULL){
        LOGE("文件打开成功 %s",cfile_path);
    }

    char data[]="this is a description of JNI and I am a Boy";

    //4. 写入文件 fwrite(写入的数据,数据的长度,写入次数,文件)
    int count=fwrite(data,strlen(data),1,file);

    if (count>0){
        LOGE("数据写入成功 %s",cfile_path);
    }

    // 5.关掉缓冲区
    fclose(file);
    env->ReleaseStringUTFChars(file_path,cfile_path);
    return (env)->NewStringUTF("ok");
//    const char * file_path_ = env->GetStringUTFChars(file_path, NULL );
//    LOGI("收到java传来的路径 %s",file_path_);
//    env->ReleaseStringUTFChars(file_path,file_path_);
//    return (jstring) env->NewStringUTF("file_path");
;}

在调用JNI接口来写入文件时,就开始作妖了。

FORTIFY: fwrite: null FILE* 

由于是初学者,所以一脸懵圈,这TM是个啥玩意啊???
在这里插入图片描述

2.问题解决

首先,将写入文件的代码注释掉,程序正常执行。
然后代码锁定在

FILE *file = fopen(cfile_path, "a+");

这代码能有啥错啊。。。。搞了半天一脸懵圈。。。还是不知道怎么改。

最后猜测到是安卓10系统的权限问题。
那么就从权限这先来一发。

先加个权限

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

还不行,然后再按照网上教程再加个这玩意

android:requestLegacyExternalStorage="true"

还是不行。
算了我动态申请吧。

public void requestPermission() {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED ||
                ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

            Toast.makeText(this, "申请权限", Toast.LENGTH_SHORT).show();

            // 申请 相机 麦克风权限
            ActivityCompat.requestPermissions(this, new String[]{
                    Manifest.permission.WRITE_EXTERNAL_STORAGE,

                    Manifest.permission.READ_EXTERNAL_STORAGE}, 100);
        }
    }

然后再调用JNI接口之前先获取一下权限。然后就看下图
在这里插入图片描述
果然还是权限的问题呀

填了一个坑,接着准备进入下一个坑。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐