2014-01-10 46 views
0

我想要做的是使用NDK創建一個JPoint(int [])。所以,我創建了JPoint類:如何使用Android NDK創建Java對象(int [])

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

內MainActivity

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

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

    // .. 
} 

public native JPoint getPersons(); 

它完美,當我把作爲參數(II)V的代替([I)VGetMethodID。所以我可以輕鬆創建一個Point(int, int)。但是當我嘗試創建JPoint(int[])時。我在我的日誌中取消虛擬機,應用程序啓動時沒有顯示任何內容,奇怪的是,我的設備開始振動。

  1. 我在做什麼錯在這裏?

  2. 爲什麼我的設備開始振動沒有深刻的原因?

回答

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

... 

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

JPoint構造函數採用的Java數組作爲參數,您提供它Ç陣列。這可能是導致虛擬機崩潰的原因。

類似的東西來這應該工作:

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

至於振動......不知道!