我要做的是使用 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[])
.我在日志中中止了一个虚拟机,应用程序启动时没有显示任何内容,奇怪的是,我的设备开始振动。
我在这里做错了什么?
为什么我的设备在没有深刻原因的情况下开始振动?
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);
至于振动...不知道!