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

标签 java android android-ndk hashmap java-native-interface

您好,我想通过 Ndk 保护我的网址和应用 key ,我想在应用中创建 hashmap 并静态存储 key 值,然后解析为 java,我遵循 StackoverflowCreate 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/

相关文章:

java - 如何按循环顺序循环?

Java进程挂起并继续

java - 如何在TimePicker中设置自定义时间

android - 为什么我们不能直接调用android(基于AIDL)远程服务的api?

安卓:有PC端口吗?

java - 是否保证重定向会延迟到所有 servlet 过滤器都已处理完毕?

android - 来自 ContentProvider 的 SimpleCursorAdapter 中的 IllegalStateException "attempt to re-open an already-closed object"

android - ndk-bundle 和 android-ndk-r15c 的区别

java - NDK,使用 FloatBuffer 作为参数

android - 仅支持 Android 4 及更高版本的 armeabi-v7a 是否安全?