JNI 检测到应用程序错误:为内部类调用 NewObject 时使用了无效的 jobject
JNI DETECTED ERROR IN APPLICATION: use of invalid jobject when calling NewObject for innerclass
这是我的 java 文件的样子:
public class MyActivity
{
public class MyVector
{
public float X;
public float Y;
public float Z;
public MyVector()
{
this.X = 0.0f;
this.Y = 0.0f;
this.Z = 0.0f;
}
public MyVector(float InX,float InY, float InZ)
{
this.X = InX;
this.Y = InY;
this.Z = InZ;
}
public void SetMyVector(float InX,float InY, float InZ)
{
X = InX;
Y = InY;
Z = InZ;
}
}
}
这是我的 cpp 方法的样子:
static auto MyVectorClassID = env->FindClass("com/example/Test/MyActivity$MyVector");
static auto MyVectorParamCtorID = env->GetMethodID(MyVectorClassID, "<init>", "(Lcom/example/Test/MyActivity;FFF)V");
MyVector SomeVector{ 10.0f, 10.0f, 10.0f };
jfloat FloatX = SomeVector.X;
jfloat FloatY = SomeVector.Y;
jfloat FloatZ = SomeVector.Z;
auto jObj = env->NewObject(MyVectorClassID, MyVectorParamCtorID, FloatX, FloatY, FloatZ); // Crashes my android device here.
在我的 cpp 代码中,我有一个名为 MyVector 的结构,类似于 java class MyVector。
我只是不知道我在这里做错了什么。
它给我 应用程序中检测到的 JNI 错误:调用 env->NewObject 时使用了无效的 jobject 0xd18a1c78。
谢谢。
谢谢@Botje、@Petesh 和@Seelenvirtuose,你们的回答帮助我理解了在 JNI 中使用内部 classes。我是新手。
我解决问题的方法是,我遵循了@Petesh 分享的 link In JNI, how do I cache the class, methodID, and fieldIDs per IBM's performance recommendations? 中的答案,并为我内部 class MyVector 的 ID 做了一个全局引用以及我的外部 class MyActivity。
因此,为了创建内部 class 的对象,这就是我必须做的。
auto jObj = env->NewObject(InnerClassID, InnerClassConstructorID, OuterclassObject, Params);
这是我的 java 文件的样子:
public class MyActivity
{
public class MyVector
{
public float X;
public float Y;
public float Z;
public MyVector()
{
this.X = 0.0f;
this.Y = 0.0f;
this.Z = 0.0f;
}
public MyVector(float InX,float InY, float InZ)
{
this.X = InX;
this.Y = InY;
this.Z = InZ;
}
public void SetMyVector(float InX,float InY, float InZ)
{
X = InX;
Y = InY;
Z = InZ;
}
}
}
这是我的 cpp 方法的样子:
static auto MyVectorClassID = env->FindClass("com/example/Test/MyActivity$MyVector");
static auto MyVectorParamCtorID = env->GetMethodID(MyVectorClassID, "<init>", "(Lcom/example/Test/MyActivity;FFF)V");
MyVector SomeVector{ 10.0f, 10.0f, 10.0f };
jfloat FloatX = SomeVector.X;
jfloat FloatY = SomeVector.Y;
jfloat FloatZ = SomeVector.Z;
auto jObj = env->NewObject(MyVectorClassID, MyVectorParamCtorID, FloatX, FloatY, FloatZ); // Crashes my android device here.
在我的 cpp 代码中,我有一个名为 MyVector 的结构,类似于 java class MyVector。 我只是不知道我在这里做错了什么。
它给我 应用程序中检测到的 JNI 错误:调用 env->NewObject 时使用了无效的 jobject 0xd18a1c78。
谢谢。
谢谢@Botje、@Petesh 和@Seelenvirtuose,你们的回答帮助我理解了在 JNI 中使用内部 classes。我是新手。
我解决问题的方法是,我遵循了@Petesh 分享的 link In JNI, how do I cache the class, methodID, and fieldIDs per IBM's performance recommendations? 中的答案,并为我内部 class MyVector 的 ID 做了一个全局引用以及我的外部 class MyActivity。
因此,为了创建内部 class 的对象,这就是我必须做的。
auto jObj = env->NewObject(InnerClassID, InnerClassConstructorID, OuterclassObject, Params);