繁体   English   中英

Java JNI字段不存在

[英]Java JNI Field does not exist

我正在尝试将c ++ dll连接到我的Java应用程序(现在正在运行测试版本)我正在尝试从对象(多边形)中的类获取x,y和z值,并且无法弄清楚为什么我得到了这个错误:

线程“主”中的异常java.lang.NoSuchFieldError:jnidemojava.Main.sortPolygon(本机方法)处的位置

我在JNI方面没有很多经验,实际上我只有大约5个小时的时间来尝试解决问题。 请帮我。 dll应该做的是从我的多边形对象内的vector类获取x,y和z值,并获取与相机的vector3f C ++代码的距离:

JNIEXPORT jobjectArray JNICALL Java_jnidemojava_Main_sortPolygon
    (JNIEnv *env, jobject, jobjectArray polygon, jobject camPos) {
    // Get the class
    jobject inCArray = env->GetObjectArrayElement(polygon, 0);
    if (NULL == inCArray) return NULL;
    jsize length = env->GetArrayLength(polygon);

    // Step 2: Perform its intended operations
    int i;
    for (i = 0; i < length; i++) {
        for (int k = i; k < length; k++) {
            jobject obji = env->GetObjectArrayElement(polygon, i);
            jclass polyClass = env->GetObjectClass(obji);
            if (polyClass == NULL)
                printf("Poly is null");
            jclass vec3Class = env->GetObjectClass(camPos);
            if (vec3Class == NULL)
                printf("Poly is null");
            jfieldID fid = env->GetFieldID(polyClass, "position", "Ljnidemojava/Vector3f;");
            jobject vec3 = env->GetObjectField(vec3Class, fid);
            jobject objk = env->GetObjectArrayElement(polygon, k);
            if (obji > objk) {
                env->SetObjectArrayElement(polygon, i, objk);
                env->SetObjectArrayElement(polygon, k, obji);
            }
        }
    }
    return polygon;
}


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package jnidemojava;

import jnidemojava.Main.Vector3f;

/**


*
 * @author Soultaker
 */
public class Main {

    /**
     * @param args the command line arguments
     */

    private static native int add(int a, int b);
    private static native int[] sort(int[] num);
    private static native int sum(int[] array);
    private static native void printArr(int[] array);
    private static native polygon[] sortPolygon(polygon[] p, Vector3f campos);

    public static void main(String[] args) {
        System.load("C:\\Users\\Soultaker\\Documents\\Visual Studio 2015\\Projects\\JNIDemoCdl\\x64\\Release\\JNIDemoCdl.dll");
        int p = add(10, 22);
        System.out.println("10 + 22 = " + p);

        int[] s = new int[]{
           10, 5, 12, 13, 33 
        };
        System.out.println("Sorted array : ");
        s = sort(s);
        printArr(s);
        System.out.println("Ohh *** sorting polygons");
        polygon[] h = sortPolygon(new polygon[]{new polygon(10, 20, 20),
            new polygon(20, 10, 50)
        }, new Vector3f(100, 10, 111)
    );
    }

    public static class Vector3f {
        float x;
        float y;
        float z;

        public Vector3f(float x, float y, float z) {
            this.x = x;
            this.y = y;
            this.z = z;
        }
    }

}

class polygon{
   Vector3f position = new Vector3f(0, 0, 0);

    public polygon(int x, int y, int z){
        position.x = x;
        position.y = y;
        position.z = z;
    }
}

你有

jfieldID fid = env->GetFieldID(polyClass, "position", "Ljnidemojava/Vector3f;");

import jnidemojava.Main.Vector3f;

显然,该字段的JNI签名是错误的。 应该类似于"Ljnidemojava/Main/Vector3f;" ,但不要依赖我,也不要尝试自己写它们。 使用javap -s的输出。 永远不会错。

jfieldID fid = env->GetFieldID(polyClass, "position", "Ljnidemojava/Vector3f;"); jobject vec3 = env->GetObjectField(vec3Class, fid);

我不确定您要在这里做什么。 position字段存在于polygon 实例中 ; 它不是任何类的静态成员,当然也不是Vector3f类。

如果要从polygon获取position ,则应将一个polygon实例(例如obji )作为第一个参数传递给GetObjectField

另外,由于Vector3fMain的内部类,因此其签名为"Ljnidemojava/Main$Vector3f;"

读取position ,将以以下方式获取其xyz字段:

jfieldID xid = env->GetFieldID(vec3Class, "x", "F");
jfloat x = env->GetFloatField(vec3, xid);
// and similarly for y and z

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM