当前位置: 首页 > 面试题库 >

如何使用JNI创建对象?

昌正奇
2023-03-14
问题内容

我需要使用NDK以及JNI将一些功能实现到Android应用程序中。

这是我所写的C代码:

#include <jni.h>
#include <stdio.h>

jobject
Java_com_example_ndktest_NDKTest_ImageRef(JNIEnv* env, jobject obj, jint width, jint height, jbyteArray myArray)
{
    jint i;
    jobject object;
    jmethodID constructor;
    jobject cls;
    cls = (*env)->FindClass(env, "com/example/ndktest/NDKTest/Point");

//what should put as the second parameter? Is my try correct, according to what
//you can find in .java file? I used this documentation: http://download.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp16027

    constructor = (*env)->GetMethodID(env, cls, "<init>", "void(V)");
//http://download.oracle.com/javase/6/docs/technotes/guides/jni/spec/functions.html#wp16660
//Again, is the last parameter ok?

    object = (*env)->NewObject(env, cls, constructor, 5, 6);
//I want to assign "5" and "6" to point.x and point.y respectively.
    return object;
}

我的问题或多或少在代码内得到了解释。也许还可以:函数(jobject)的返回类型可以吗?

现在,NDKTest.java:

package com.example.ndktest;

import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;

public class NDKTest extends Activity {
    /** Called when the activity is first created. */
    public native Point ImageRef(int width, int height, byte[] myArray);
    public class Point
    {

        Point(int myx, int myy)
        {
            x = myx;
            y = myy;
        }

        int x;
        int y;
    }

    @Override
    public void onCreate(Bundle savedInstanceState)
    {

         super.onCreate(savedInstanceState);
         TextView tv = new TextView(this);
         byte[] anArray = new byte[3];
         for (byte i = 0; i < 3; i++)
             anArray[i] = i;
         Point point = ImageRef(2, 3, anArray);
         tv.setText(String.valueOf(point.x));
            setContentView(tv);     
    }



    static
    {
       System.loadLibrary("test");
    }
}

当我尝试运行代码时,它不起作用。


问题答案:

既然Point内部类,那么获得它的方法就是

jclass cls = (*env)->FindClass(env, "com/example/ndktest/NDKTest$Point");

$内部类的约定在权威规范中并未真正明确记录,但是根深蒂固地存在于如此多的工作代码中,因此不太可能更改。但是,如果您限制JNI代码与顶级类一起使用,则
感觉 会更健壮。

您想要一个以两个int作为参数的构造函数。的签名是(II)V,因此:

constructor = (*env)->GetMethodID(env, cls, "<init>", "(II)V");

下次,在代码中包含一些错误处理,这样您就可以知道其中哪些部分不起作用!



 类似资料:
  • 问题内容: 我想使用String创建一个JSON对象。 示例:JSON 为了创建上述JSON,我正在使用它。 我想知道如何创建一个具有JSON数组的JSON。 以下是示例JSON。 谢谢。 问题答案: 可能就是您想要的。

  • 问题内容: 我有以下JNI方法,它可以本地创建Java对象的集合,然后将其返回给Java: 我需要释放用本机代码创建的对象,还是由GC自动完成?如果可以,我该如何将其返回Java? 问题答案: 您不需要释放在本机代码中创建的Java对象。实际上,您不能。当没有其他引用时,垃圾收集器可以释放对象。 有时在本机代码中释放对Java对象的 引用 很有用。当本机代码保存但不再需要对大型对象的引用或大量引用

  • 我是JNI(和java)的新手,所以如果这只是一个愚蠢的错误,我提前道歉。但是,经过大量的搜索,我找不到一个解释或解决办法。 我有一个名为

  • 问题内容: 我试图通过传递另一个jsonObject与jsonObject转换jsonArray。请提供任何示例代码? 问题答案: 这样,您可以为响应编写POJO / Model类 ----------------------------------- com.example.HomePlace.java -------- ----------------------------------- c

  • 问题内容: 基本上这就是问题,应该如何用javascript动态地从HTML字符串构造一个Document对象? 问题答案: 规范中定义了两种方法,分别2和HTML5。前者创建一个XML文档(包括XHTML),后者创建一个HTML文档。两者都作为功能驻留在接口上。 实际上,这些方法还很年轻,仅在最近的浏览器版本中实现。根据http://quirksmode.org和MDN的说明,以下浏览器支持:

  • 我试图从字符串数组中创建一个新对象,但无法正确创建所需的对象。 我正在尝试创建一个对象,比如: 这是我的代码: null null