如何修复将要转移到Java的2D数组代码,使用JNI?

时间:2019-07-11 06:34:39

标签: java c++ arrays java-native-interface

我试图将数组从c ++传递给java。编译没有错误。但无法运行(崩溃)。当我调试代码时,返回代码中会发生错误

我尝试实现此代码how to return c++ char 2d array using JNI to JAVA

这是我的代码

    JNIEXPORT jobjectArray JNICALL my_function();
    // ...
    // some code
    // ...

    // i want convert float point[3][2] to java

    jclass intArray1DClass = env->FindClass("[I");
    jclass intArray2DClass = env->FindClass("[[I");

     //  float point[3][2]
     jint sizeX = 3;
     jint sizeY = 2;


    jobjectArray array2D = env->NewObjectArray(
                sizeX, intArray2DClass, NULL);

    for (jint i = 0; i < sizeX; i++)
    {
        jobjectArray array1D = env->NewObjectArray(
                    sizeY, intArray1DClass, NULL);

        for (jint y = 0; y < sizeY; y++)
        {
            jfloatArray value = env->NewFloatArray(point[i][y]); // float point[3][2]
            env->SetObjectArrayElement(array1D, y, value);
        }

        env->SetObjectArrayElement(array1D, i, array1D);
    }

    return array2D;

这就是我从Java调用函数的方式。是吗?

     float[][] point = my_function()

谢谢

更新

最后我使用一维数组,因为它很容易编写代码。根据{{​​3}},我们应该使用一维数组

     jint sizeX = 6;

     jfloatArray array1D = env->NewFloatArray(sizeX);

     env->SetFloatArrayRegion(array1D, 0, sizeX, point);


     return array1D;

1 个答案:

答案 0 :(得分:2)

首先,您似乎在声明了一个整数类型的Java数组,即//Get the number of count in web table. WebElement table =d.findElement(By.xpath("//*[@id='ui-grid']/div/div/div/div[2]/table/tbody")); List<WebElement> trcount = table.findElements(By.tagName("tr")); int size = trcount.size(); System.out.println(size); //Select particular tag(Select tag) List<WebElement> Select = table.findElements(By.xpath("//*[@id='ui-grid']/div/div/div/div[2]/table/tbody/tr/td/span/select")); int select_size = Select.size(); System.out.println(select_size); //If web table have select tag perfrom below else to catch no search elements exceptions. try{ for(int j=1;j<=select_size;j++) { By tag = By.xpath("(//*[@class='ng-star-inserted']/span/select)["+j+"]"); System.out.println("Test"); } }catch(Exception e){ System.out.println((e.getMessage())); } //Select particular tag(Input tag) List<WebElement> Select1 = table.findElements(By.xpath("//*[@id='ui-grid']/div/div/div/div[2]/table/tbody/tr/td/span/input")); int select_input = Select1.size(); System.out.println(select_input); try{ for(int i=1;i<=select_input;i++) { By tag1 = By.xpath("(//*[@class='ng-star-inserted']/span/input)["+i+"]"); System.out.println("Test"); d.findElement(tag1).sendKeys("12345"); Thread.sleep(3000); //d.findElement(Accept_button).click(); } }catch(Exception e){ System.out.println((e.getMessage())); } ,而不是int [][]

第二,为什么将float[][]设置为数组的元素?它应该是简单的float。

第三,在最后一行中,您的意思可能是jfloatArray

第四,在声明数组时,需要指定它包含的类,因此对于2D数组,它包含1D数组,对于1D数组,它仅包含浮点数。

PS:链接的问题/答案实际上是在返回3D数组。因此,您需要减少代码中的维数。