![](/img/trans.png)
[英]Constructing a HashMap<String, String[]> through JNI
[英]How to create HashMap<String, String> through JNI then parse to java
嗨,我想通过 Ndk 保护我的 web url 和应用程序密钥,我想在应用程序中创建hashmap
并静态存储密钥值然后解析到 java,我遵循Stackoverflow答案,如Create HashMap以及JNI 将对象从 C++ 传递到 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无效,所以我通过C更改为Java String,如上面的答案中的@Michael所述,现在代码可以正常工作了经过一些修改也可以更改()
#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;
}
key
和val
是HashMap.put
无效参数。 您需要使用C字符串创建Java字符串,例如使用NewStringUTF
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.