2010-11-19 24 views
3

我正在使用Android,JNI和NDK测试一些函数。JNI CALL更改jclass参数或如何从jclass参数获取jobject

我有以下的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类型。

我想知道如何改变jclassjobject参数。

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

如何更改方法签名?或者我如何从jclass paremeter获取jobject?

谢谢。

回答

8

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

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

另外,您可以从JNI创建Java对象,但在这种情况下,我认为您希望能够更改成员变量contador的值,以免对您有所帮助。