【发布时间】:2019-12-20 05:30:06
【问题描述】:
这就是我的 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 类 MyVector。 我只是不知道我在这里做错了什么。
它给了我 JNI DETECTED ERROR IN APPLICATION: use of invalid jobject 0xd18a1c78 when env->NewObject 被调用。
谢谢。
【问题讨论】:
-
也许你的班级
MyVector应该是static? -
我担心您正在使用
static auto MyVectorClassID =- 我很确定您不能在这样的调用中保留类 ID - 您需要使用 @ 将其转换为全局引用987654327@(参见stackoverflow.com/questions/10617735/…) -
您是否真的检查它们的返回值以查看它们是否有效?
MyVector是不公开该特定包的模块的一部分吗?当你传递一个无效的类 id 或方法 id 时,你会得到什么错误?你有没有检查过ExceptionOccurred() -
构造函数的
Lcom/example/Test/MyActivity;参数在哪里?我所看到的只是它后面的三个花车。正如@Seelenvirtuose 所说,你确定javaMyVector类不应该是静态的吗?
标签: java c++ java-native-interface