如何使用 Android NDK 创建 Java 对象(int[])



我要做的是使用 NDK 创建一个JPoint(int [])。所以我创建了JPoint类:

JPoint.java

public class JPoint {
    int x;
    int y;
   public JPoint(int[] xy)
   {
     x = xy[0];
     y = xy[1];
   }
   public JPoint(int x, int y) 
   {
     this.x = x;
     this.y = y;
   }
    public int getX() 
    {
      return x;       
    }
    public int getY() 
    {
      return y;
    }
}

在 jni 中,我创建了此方法

JNI/SQLiteNative.cpp

JNIEXPORT jobject JNICALL
Java_com_example_jnisqliteexperiment_MainActivity_getPersons(
            JNIEnv *env,
            jobject callingObject)
{
    jmethodID constructor;
    int x;
    int y;
    x = 10;
    y = 20;
    int xy[2] = {4, 5};
    jclass cls = env->FindClass("com/example/jnisqliteexperiment/JPoint");
    //creating new Jpoint(int[])
    constructor = env->GetMethodID( cls, "<init>", "([I)V");
    jobject obj = env->NewObject(cls, constructor,  xy);
    //creating new Jpoint(int, int)
    // constructor = env->GetMethodID(cls, "<init>", "(II)V");
    // jobject obj = env->NewObject(cls, constructor,  x ,y);
    return obj;
}

在主活动内部

protected void onCreate(Bundle savedInstanceState)
{
  // ..
  JPoint point = getPersons();
  textView.setText(String.valueOf(point.getX()));
  // ..
}
public native JPoint getPersons();

当我在 GetMethodID 中作为参数 (II)V 而不是 ([I)V 时,它工作得很好。所以我可以轻松创建一个Point(int, int).但是当我试图创建一个JPoint(int[]).我在日志中中止了一个虚拟机,应用程序启动时没有显示任何内容,奇怪的是,我的设备开始振动。

  1. 我在这里做错了什么?

  2. 为什么我的设备在没有深刻原因的情况下开始振动?

int xy[2]={4,5};
...
constructor = env->GetMethodID( cls, "<init>", "([I)V");
jobject obj = env->NewObject(cls, constructor,  xy);

JPoint构造函数将 Java 数组作为参数,您正在为其提供一个 C 数组。这可能是导致 VM 崩溃的原因。

与此类似的东西应该有效:

int xy[2]={4,5};
...
jintArray jxy = env->NewIntArray(2);
env->SetIntArrayRegion(jxy, 0, 2, xy);
constructor = env->GetMethodID(cls, "<init>", "([I)V");
jobject obj = env->NewObject(cls, constructor,  jxy);

至于振动...不知道!

相关内容

  • 没有找到相关文章

最新更新