如何通过JNI创建HashMap<String, String>,然后解析到java?

 2023-01-20    264  

问题描述

嗨,我想通过NDK保护我的Web URL和应用程序秘密键创建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;
}

错误

如何通过JNI创建HashMap&lt;String, String&gt;,然后解析到java?

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)

推荐答案

我解决了我的问题,我在代码中发现的主要问题是我错过了 jnicall line,作为钥匙和val是无效的因此,我通过@michael在上面的答案中提到的Chike通过C更改为Java字符串,现在代码在修改后正常工作也可以更改()

#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 NewStringUTF .

以上所述是小编给大家介绍的如何通过JNI创建HashMap<String, String>,然后解析到java?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/26109.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。