Android NDK值有时为空



我正在尝试将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")
}
}
}

以上代码在除安卓5.1和安卓6之外的其他安卓版本上运行良好。在Android版本5.1和6上,有时上述值会作为空值获得。这种行为是不一致的。有时它返回正确的值,有时它返回空值。

代码在其他Android版本上运行得非常好,如Android 7、8、10。

GetStringUTFChars返回的缓冲区只有在不调用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[]将插入并返回一个伪字符串。你可能不想要这种行为。

最新更新