2010-11-19 14 views
3

Je teste certaines fonctions avec Android, JNI et NDK.JNI CALL modifier le paramètre jclass ou comment obtenir un jobject à partir d'un paramètre jclass

J'ai la classe JAVA suivante:

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

Je l'ai utilisé javah -jni pour générer le fichier d'en-tête:

#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 

Comme vous pouvez le voir, la deuxième paramter est le type JClass.

Je me demande comment je peux changer JClass pour un jobject paramètre.

J'ai besoin d'un paramètre jobject pour obtenir une valeur d'un champ de la classe qui appelle cette fonction native.

Comment puis-je modifier la signature de la méthode? ou comment puis-je obtenir jobject de jclass paremeter?

Merci.

Répondre

8

Les méthodes statiques n'ont pas accès à un objet (le paramètre this implicite), uniquement l'accès aux autres méthodes/propriétés statiques de cette classe. C'est pourquoi votre méthode native a un jclass au lieu d'un jobject.

Changez donc votre méthode Java pour qu'elle soit non-statique et régénérez votre fichier d'en-tête. En outre, vous pouvez créer des objets Java à partir de JNI, mais dans ce cas, je pense que vous voulez être en mesure de changer la valeur de la variable membre contador afin que cela ne vous aiderait pas.