Java JNI 字段不存在
Java JNI Field does not exist
我正在尝试将我的 c++ dll 连接到我的 java 应用程序(运行 现在是测试版本)我正在尝试从 [=22] 获取 x、y 和 z 值=] 在一个对象(多边形)内并且无法完全弄清楚为什么我会收到此错误:
Exception in thread "main" java.lang.NoSuchFieldError: position
at jnidemojava.Main.sortPolygon(Native Method)
我对 JNI 的经验不多,我实际上只花了大约 5 个小时来解决问题。请帮我。 dll 应该做的是从我的多边形对象中的向量 class 获取 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
实例中;它不是任何 class 的静态成员,当然也不是 Vector3f
class.
如果您想从 polygon
中获取 position
,您应该将 polygon
的实例(例如 obji
)作为第一个参数传递给 GetObjectField
.
此外,由于 Vector3f
是 Main
的内部 class,其签名将是 "Ljnidemojava/Main$Vector3f;"
阅读 position
后,您可以通过以下方式获取其 x
、y
和 z
字段:
jfieldID xid = env->GetFieldID(vec3Class, "x", "F");
jfloat x = env->GetFloatField(vec3, xid);
// and similarly for y and z
我正在尝试将我的 c++ dll 连接到我的 java 应用程序(运行 现在是测试版本)我正在尝试从 [=22] 获取 x、y 和 z 值=] 在一个对象(多边形)内并且无法完全弄清楚为什么我会收到此错误:
Exception in thread "main" java.lang.NoSuchFieldError: position at jnidemojava.Main.sortPolygon(Native Method)
我对 JNI 的经验不多,我实际上只花了大约 5 个小时来解决问题。请帮我。 dll 应该做的是从我的多边形对象中的向量 class 获取 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
实例中;它不是任何 class 的静态成员,当然也不是 Vector3f
class.
如果您想从 polygon
中获取 position
,您应该将 polygon
的实例(例如 obji
)作为第一个参数传递给 GetObjectField
.
此外,由于 Vector3f
是 Main
的内部 class,其签名将是 "Ljnidemojava/Main$Vector3f;"
阅读 position
后,您可以通过以下方式获取其 x
、y
和 z
字段:
jfieldID xid = env->GetFieldID(vec3Class, "x", "F");
jfloat x = env->GetFloatField(vec3, xid);
// and similarly for y and z