gpt4 book ai didi

java - 如何使用 JNI 创建对象?

转载 作者:IT老高 更新时间:2023-10-28 20:31:05 24 4
gpt4 key购买 nike

我需要使用 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 代码限制为使用顶级类,它会感觉更加健壮。

您需要一个将两个整数作为参数的构造函数。其签名是 (II)V,所以:

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

下一次,在你的代码中加入一些错误处理,这样你就会知道它的哪一部分不起作用!

关于java - 如何使用 JNI 创建对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7260376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com