Android NDK 值有时为空

Android NDK values coming as empty sometimes

我正在尝试将 NDK 用于我的 android 应用程序。我正在使用地图存储一些关键值,如下所示:

#include <jni.h>
#include <string>

#include <iostream>
#include <unordered_map>

class UrlHash {

    std::unordered_map<std::string, std::string> urlHash;

public:
    std::string getUrl(std::string urlKey) {
        return urlHash[debugUrlKey];
    }

    UrlHash() {
        urlHash["dummy"] = "dumyValue";
        urlHash["dump_url"] = "https://dump.server.com";
        urlHash["dump_url2"] = "https://dump2.server.com";
    }
};

extern "C"
JNIEXPORT jstring JNICALL
Java_my_com_mynativecapp_UrlProvider_getUrl(JNIEnv *env, jobject thiz, jstring urlName) {
UrlHash _debugHashtableInstance;
const char *NativeUrlName = env->GetStringUTFChars(urlName, 0);
env->ReleaseStringUTFChars(urlName, NativeUrlName);
return env->NewStringUTF(_debugHashtableInstance.getDebugUrl(NativeUrlName).c_str());
}

通过以下方式检索这些值:

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.TextView

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        findViewById<Button>(R.id.sample_text).setOnClickListener {
            doExe()
        }

    fun doExe(){
        var dummy  = getUrl("dummy")
        var dump_url  = getUrl("dump_url")
        var dump_url2  = getUrl("dump_url2")
    }

    external fun getUrl(urlName: String): String

    companion object {
        init {
            System.loadLibrary("native-lib")
        }
    }
}

上述代码在除Android 5.1 和Android 6 以外的其他android 版本上运行良好。在Android 版本5.1 和6 上,有时会获得上述值作为空值。此行为不一致。有时它 returns 正确值,有时它 returns 空值。

代码在其他 Android 版本上工作得很好,例如 Android 7,8,10.

GetStringUTFChars 编辑的缓冲区 return 只有在您不调用 ReleaseStringUTFChars.

时才可用

在缓冲区可用时进行查找,而不是:

const char *NativeUrlName = env->GetStringUTFChars(urlName, 0);
auto result = _debugHashtableInstance.getDebugUrl(NativeUrlName);
env->ReleaseStringUTFChars(urlName, NativeUrlName);
return env->NewStringUTF(result.c_str());

作为旁注:如果密钥不存在,std::unordered_map 上的 operator[] 将插入和 return 虚拟字符串。您可能不希望出现这种行为。