簡體   English   中英

如何返回 ArrayList<boolean> 在 JNI java 中?</boolean>

[英]How to return ArrayList<Boolean> in JNI java?

我是 JNI 的新手,我想從 C++ 端創建一個ArrayList<Boolean>

我有以下情況:

import java.util.ArrayList;

public class createArrayJNI {
    static {
        System.loadLibrary("libnative");
    }
    
    public static void main(String[] args) {
        createArrayJNI jni =  new createArrayJNI();
        ArrayList<Boolean> array = jni.creatArray();
        System.err.println(array);
    }

    public native ArrayList<Boolean> creatArray();
}

我的 cpp 文件是:

...
JNIEXPORT jobject JNICALL Java_createArrayJNI_creatArray
(JNIEnv \*env, jobject thisObject) {

    jclass java_util_class = env->FindClass("java/util/ArrayList");
        jmethodID java_util_method_constructor = env->GetMethodID(java_util_class, "<init>", "()V");
        jmethodID java_add_method = env->GetMethodID(java_util_class, "add", "(Ljava/lang/Object;)Z");
        jobject java_util_object = env->NewObject(java_util_class, java_util_method_constructor, "");
        jboolean a = true;
         env->CallBooleanMethod(java_util_object, java_add_method, a);
    
         return java_util_object;
}

它告訴我:

# 
# A fatal error has been detected by the Java Runtime Environment:
# 
# SIGSEGV (0xb) at pc=0x00000001099110ac, pid=24207, tid=4355
# 
# JRE version: OpenJDK Runtime Environment Homebrew (19.0.1) (build 19.0.1)
# Java VM: OpenJDK 64-Bit Server VM Homebrew (19.0.1, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, bsd-aarch64)
# Problematic frame:
# V  \[libjvm.dylib+0x1f10ac\]  AccessInternal::PostRuntimeDispatch\<G1BarrierSet::AccessBarrier\<598116ull, G1BarrierSet\>, (AccessInternal::BarrierType)2, 598116ull\>::oop_access_barrier(void\*)+0xc
# 
# No core dump will be written. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
# 
# An error report file with more information is saved as:
# /Users/taki/Desktop/Preparation doctorat ERM/Projects/Julia4C/hs_err_pid24207.log
# 
# If you would like to submit a bug report, please visit:
# https://github.com/Homebrew/homebrew-core/issues
# 
zsh: abort      /usr/bin/env  --enable-preview -XX:+ShowCodeDetailsInExceptionMessages -cp

我很確定錯誤來自env->CallBooleanMethod(java_util_object, java_add_method, a); 因為add方法需要一個object,而a是jboolean。

我嘗試轉換a變量,但效果不佳。

ArrayList<Boolean>ArrayList相同。 在運行時, <Boolean>不存在。 這稱為“類型擦除”。

接下來要注意的是,您沒有嘗試添加一個Boolean (一種Object ),而是一個原始的boolean 這可能被解釋為 object 指針,因為它不是 null,它是Object的地址 - 但true (數字 1)不是任何有效地址,當 JVM 取消引用它時它崩潰。

您需要獲取 static 字段Boolean.TRUE並將其添加到ArrayList中。

I found a way to instantiate a java Boolean Object from c++ using Boolean.valueOf() function. I first get staticMethodId and then use it to create jobject and use the same object in the add method as follow:

JNIEXPORT jobject JNICALL Java_createArrayJNI_creatArray
  (JNIEnv *env, jobject thisObject) {
    std::vector<bool> cpp_vec;
    cpp_vec.push_back(true);
    cpp_vec.push_back(false);
    cpp_vec.push_back(true);
    
    jclass java_util_class = env->FindClass("java/util/ArrayList");
    jmethodID java_util_method_constructor = env->GetMethodID(java_util_class, "<init>", "()V");
    jmethodID java_add_method = env->GetMethodID(java_util_class, "add", "(Ljava/lang/Object;)Z");
    
    jobject java_util_object = env->NewObject(java_util_class, java_util_method_constructor, "");
    
    jclass bool_class = env->FindClass("java/lang/Boolean");
    jmethodID bool_init = env->GetStaticMethodID(bool_class, "valueOf", "(Z)Ljava/lang/Boolean;");
    
    for (int i=0; i< cpp_vec.size(); i++){
      jboolean curr_element = cpp_vec[i];
      jobject bool_object = env->CallStaticObjectMethod(bool_class, bool_init, (jboolean) cpp_vec[i]);
      if (bool_object == NULL){
        std::cout << "Cannot instantiate the Boolean object";
        return NULL;
      } 
      env->CallBooleanMethod(java_util_object, java_add_method, bool_object);
    }
    return java_util_object;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM