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

标签 java android c++ android-ndk java-native-interface

我想做的是使用 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;
}

在主 Activity 中

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

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

  // ..
}

public native JPoint getPersons();

当我在 GetMethodID 中将 ([I)V 作为参数放入 (II)V 时,它工作得很好。所以我可以很容易地创建一个 Point(int, int)。但是当我尝试创建一个 JPoint(int[]) 时。我在我的日志中看到一个 VM 中止,应用程序启动时没有显示任何内部内容,奇怪的是,我的设备开始振动。

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

至于振动……不知道!

关于java - 如何使用 Android NDK 创建 Java 对象(int[]),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21044853/

相关文章:

android - 是否可以在使用 adjustPan 作为软输入模式时始终显示操作栏?

c++ - QSvgGenerator 在哪些单元中运行?

java - 用于 Java 的 CSV API

java - 如何在 JavaEE 中实现一个持续运行的进程

Java:列表未正确通过套接字发送?

c++ - xcode 解决方案的 node-gyp 链接问题

c++ - 如何使用 libpqxx 从数组中获取值?

java - Java的ReentrantLock到底是针对什么获取锁的呢?

android - 如何在 Android 中自定义 Facebook 登录按钮

android - 如何在 Flutter 的另一个小部件中嵌入 webview?