Stam
Stam

Reputation: 2490

How to create a Java Object(int[]) with Android NDK

What I am trying to do is to create a JPoint(int []) using NDK. So I have created the JPoint class:

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

in jni I have created this method

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

inside the MainActivity

protected void onCreate(Bundle savedInstanceState)
{
  // ..

  JPoint point = getPersons();
  textView.setText(String.valueOf(point.getX()));

  // ..
}

public native JPoint getPersons();

It works perfectly when I put as an argument (II)V instead of ([I)V in GetMethodID. So I can easily create a Point(int, int). But when I am trying to create a JPoint(int[]). I take a VM aborting in my Log, the Application starts without showing anything inside and the strange is, that my device starts vibrating.

  1. What am I doing wrong here ?

  2. Why does my device start vibrating without a profound reason ?

Upvotes: 0

Views: 1319

Answers (1)

mbrenon
mbrenon

Reputation: 4941

int xy[2]={4,5};

...

constructor = env->GetMethodID( cls, "<init>", "([I)V");
jobject obj = env->NewObject(cls, constructor,  xy);

The JPoint constructor takes a Java array as parameter, you are providing it a C array. This is probably what causes the VM crash.

Something similar to this should work:

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

As for the vibration... no idea!

Upvotes: 3

Related Questions