【问题标题】:JNI CALL change jclass parameter or how to obtain a jobject from a jclass parameterJNI CALL 更改 jclass 参数或如何从 jclass 参数获取作业
【发布时间】:2010-11-19 14:25:48
【问题描述】:

我正在使用 Android、JNI 和 NDK 测试一些功能。

我有以下 JAVA 类:

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

public class JNITest extends Activity {
    private int contador;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        contador = 0;
        TextView label = (TextView)findViewById(R.id.Text);
        label.setText(Integer.toString(contador));
    }

    public void addClick(View addButton) {
        nativeAdd(1);
        TextView label = (TextView)findViewById(R.id.Text);
        label.setText(Integer.toString(contador));
    }

    private static native void nativeAdd(int value);

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

我已经使用javah -jni生成头文件:

#include <jni.h>
/* Header for class es_xxxxx_pruebas_JNITest */

#ifndef _JNITestNative
#define _JNITestNative
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_xxxxx_tests_JNITest
 * Method:    nativeAdd
 * Signature: (I)V
 */
JNIEXPORT void JNICALL Java_com_xxxxx_tests_JNITest_nativeAdd
(JNIEnv *, jclass, jint);

#ifdef __cplusplus
}
#endif
#endif

如您所见,第二个参数是 jclass 类型。

我想知道如何为 jobject 参数更改 jclass

我需要一个 jobject 参数来从调用这个原生函数的类的字段中获取值。

如何更改方法签名?或者如何从 jclass 参数中获取作业?

谢谢。

【问题讨论】:

    标签: java android java-native-interface


    【解决方案1】:

    静态方法无法访问对象(隐式this 参数),只能访问该类的其他静态方法/属性。这就是为什么你的本地方法有一个 jclass 而不是一个 jobject。

    因此,将您的 Java 方法更改为非静态并重新生成您的头文件。

    顺便说一句,您可以从 JNI 创建 Java 对象,但在这种情况下,我认为您希望能够更改成员变量 contador 的值,这样对您没有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多