如何从本机c中的Assert文件夹访问.txt文件?

时间:2017-11-17 14:17:29

标签: android android-ndk

我无法使用NDK从C中的Assert文件夹访问.txt文件。 有没有人有一个想法如何从我的C文件访问该文件。

public class HelloJni extends AppCompatActivity {
    static {
        System.loadLibrary("hello-jni");
    }
    private AssetManager mgr;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hello_jni);
        mgr = getResources().getAssets();
        stringFromJNI(mgr);

    }
    public native String  stringFromJNI(AssetManager mgr);

}

在Hello-jni.c文件中,我需要访问.txt

JNIEXPORT jstring JNICALL
Java_com_inspiringlife_fido_HelloJni_stringFromJNI( JNIEnv* env,
                                                  jobject thiz, jobject assetManager )
{
    //access .txt file from assert folder 
    return (*env)->NewStringUTF(env, "Hello JNI ");
}

1 个答案:

答案 0 :(得分:0)

AAssetManager* mgr = AAssetManager_fromJava(env, assetManager);
assert(NULL != mgr);

AAsset* testAsset = AAssetManager_open(mgr, "hello.txt", AASSET_MODE_UNKNOWN);
if (testAsset)
{
    assert(testAsset);

    size_t assetLength = AAsset_getLength(testAsset);

    __android_log_print(ANDROID_LOG_DEBUG, "!!!!Native Audio", "Asset file size: %d\n", assetLength);

    char* buffer = (char*) malloc(assetLength + 1);
    AAsset_read(testAsset, buffer, assetLength);
    buffer[assetLength] = 0;

    __android_log_print(ANDROID_LOG_INFO, "!!!!!Test Asset Manager", "The value is %s", buffer);

    AAsset_close(testAsset);
    free(buffer);
}
else
{
    __android_log_print(ANDROID_LOG_ERROR, "!!!!!Test Asset Manager", "Cannot open file");
}

//rsa_gen_keys(pub, priv);
return (*env)->NewStringUTF(env, "!!!Hello from JNI");

现在我可以从assert文件中读取文件了。