有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何使用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. 为什么我的设备在没有深刻原因的情况下开始振动


共 (1) 个答案

  1. # 1 楼答案

    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);
    

    至于振动。。。不知道