您好,我想通过 Ndk 保护我的网址和应用 key ,我想在应用中创建 hashmap
并静态存储 key 值,然后解析为 java,我遵循 Stackoverflow 像 Create HashMap 这样的回答还有JNI passing objects from C++ to Java从上面的链接中弃用了一些方法并且没有找到任何方法来执行此操作,我创建了 HashMap
但它给了我错误
#include <jni.h>
extern "C"
JNIEXPORT jobject
Java_com_company_project_home_ui_MainActivity_getUrlMap(
JNIEnv *env,
jobject /* this */) {
jclass mapClass = env->FindClass("java/util/HashMap");
if(mapClass == NULL)
{
return NULL;
}
jsize map_len = 1;
jmethodID init = env->GetMethodID(mapClass, "<init>", "(I)V");
jobject hashMap = env->NewObject(mapClass, init, map_len);
jmethodID put = env->GetMethodID(mapClass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
char *key = (char*)"URL_TEST_API" ;
char *val = (char*)"home.php";
env->CallObjectMethod(hashMap, put, key, val);
return hashMap;
}
错误
A/art: art/runtime/java_vm_ext.cc:410] native: #12 pc 00dd8f2f /data/app/com.company.project-1/oat/arm/base.odex (void com.company.project.home.ui.MainActivity.onCreate(android.os.Bundle)+714)
最佳答案
我解决了我的问题,我在代码中发现的主要问题是我错过了在 JNIEXPORT 行之后添加 JNICALL ,并且因为 Key 和 val 无效所以我改变了正如@Michael 在上面的回答中提到的通过 C 转换为 Java String,现在代码在一些修改后工作正常也改变了 ()
#include <jni.h>
extern "C"
JNIEXPORT jobject
JNICALL
Java_com_company_project_somePackage_SplashScreen_getHashMap(JNIEnv *env, jobject /* this */) {
jclass mapClass = env->FindClass("java/util/HashMap");
if(mapClass == NULL)
{
return NULL;
}
jsize map_len = 1;
jmethodID init = env->GetMethodID(mapClass, "<init>", "(I)V");
jobject hashMap = env->NewObject(mapClass, init, map_len);
jmethodID put = env->GetMethodID(mapClass, "put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
jenv->CallObjectMethod(hashMap, put, env->NewStringUTF("URL_TEST_API"), env->NewStringUTF("home.php"));
return hashMap;
}
关于java - 如何通过 JNI 创建 HashMap<String, String> 然后解析为 java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47224571/