欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

undefined reference to 'AAssetManager_fromJava'

程序员文章站 2022-06-22 20:02:49
...

在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);
}

我的目录结构:

undefined reference to 'AAssetManager_fromJava'undefined reference to 'AAssetManager_fromJava'

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

编译后报错:

undefined reference to 'AAssetManager_fromJava'

undefined reference to 'AAssetManager_fromJava'

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

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

undefined reference to 'AAssetManager_fromJava'undefined reference to 'AAssetManager_fromJava'

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