【问题标题】:JNI DETECTED ERROR IN APPLICATION: use of invalid jobject when calling NewObject for innerclass应用程序中的 JNI 检测到错误:为内部类调用 NewObject 时使用了无效的对象
【发布时间】: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 所说,你确定java MyVector 类不应该是静态的吗?

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


【解决方案1】:

谢谢@Botje、@Petesh 和@Seelenvirtuose,您的回答帮助我了解在 JNI 中使用内部类。我是新手。

我解决问题的方法是,我按照@Petesh 共享的此链接In JNI, how do I cache the class, methodID, and fieldIDs per IBM's performance recommendations? 中的答案,对我的内部类MyVector 和外部类MyActivity 的ID 进行了全局引用。

所以,为了创建一个内部类的对象,这是我必须做的。

auto jObj = env->NewObject(InnerClassID, InnerClassConstructorID, OuterclassObject, Params);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-15
    • 2021-04-06
    • 1970-01-01
    • 2018-01-19
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多