undefined reference to 'AAssetManager_fromJava'

本文介绍如何在Android JNI开发中使用C++读取assets文件夹内的资源,并提供了一个具体的示例,展示了从Java调用C++方法的过程及C++中读取文件的具体实现。此外,还分享了在使用CMake构建时遇到的问题及其解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Android JNI开发时,有时需要在C++文件中读取assets中的文件,通常的做法是通过public native void  readFromAssets(AssetManager ass, String filename);方法实现,网上有很多资料,一般是在Java中定义native方法:

public native void  readFromAssets(AssetManager ass, String filename);

然后再C++中实现

extern "C"
void  Java_ghome_snda_com_ndktest_MainActivity_readFromAssets(JNIEnv* env,jclass tis
        ,jobject assetManager,jstring filename)
{
    AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);
    if(mgr==NULL)
    {
        __android_log_print(ANDROID_LOG_INFO, "zj", ":%s", "AAssetManager==NULL");
        //LOGI(" %s","AAssetManager==NULL");
        return ;
    }

    /*获取文件名并打开*/
    jboolean iscopy;
    const char *mfile = env->GetStringUTFChars(filename, &iscopy);
    AAsset* asset = AAssetManager_open(mgr, mfile,AASSET_MODE_UNKNOWN);
    env->ReleaseStringUTFChars(filename, mfile);
    if(asset==NULL)
    {
       // LOGI(" %s","asset==NULL");
        __android_log_print(ANDROID_LOG_INFO, "zj", ":%s", "asset==NULL");
        return ;
    }
    /*获取文件大小*/
    off_t bufferSize = AAsset_getLength(asset);
    //LOGI("file size         : %d\n",bufferSize);
    __android_log_print(ANDROID_LOG_INFO, "zj", "file size  : %d\\n", bufferSize);
    char *buffer=(char *)malloc(bufferSize+1);
    buffer[bufferSize]=0;
    int numBytesRead = AAsset_read(asset, buffer, bufferSize);
  //  LOGI(": %s",buffer);
    __android_log_print(ANDROID_LOG_INFO, "zj", ": %s\\n", buffer);
    free(buffer);
    /*关闭文件*/
    AAsset_close(asset);
}

我的目录结构:

我所实现的功能是在C++中读取test.txt中的内容。

编译后报错:



解决方法::NDK使用的CmakeList.txt,该错误是由于CMake文件配置错误引起的

只需要在find_library和target_like_libraries中加入Android声明即可:


网上很多针对这个问题的解决方案都说的模棱两可,让人看不明白,现在通过这种方法成功解决。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值