2011-09-30 17 views
10

Estoy escribiendo un programa en Java y me gustaría crear una interfaz nativa para una biblioteca escrita en C++. Pero estoy confundido con la forma de escribir una declaración de método nativo para un constructor.Crear el método nativo de Java para el constructor

Decir que tengo esta clase de C++ y constructor:

template <class _Tp,class _Val> 
    class Arbitrator 
    { 
    public: 
    Arbitrator(); 
    } 

¿cómo iba a escribir una declaración de método nativo?

Esto es lo que estoy haciendo hasta ahora: paquete hbot.proxy.bwsal.arbitrator;

public class Arbitrator<Tp, Val> 
{ 
    public native Arbitrator Arbitrator(); 
} 

¿Es así como haría esto?

Gracias

+0

¿Qué dice javah sobre tu clase? Si funciona, puedes usarlo. – bmargulies

Respuesta

12

Crear método nativo. Por ejemplo, private native void init(). Llámalo desde el constructor en Java. En su implementación JNI accede a la clase C++ según sea necesario.

Deberá usar las firmas de métodos generados JNI de todos modos, por lo que no puede asignar directamente la clase Java a la clase C++ si eso es lo que quería hacer.

+0

bien, entiendo que el código de implementación tendrá que usar las firmas del método JNI, me preguntaba si esa sería la declaración nativa correcta del constructor, o sería mejor hacer lo que dices y llamar a un método nativo de el constructor de Java? –

+1

No puede tener un constructor nativo. Así que tener el método 'init' es probablemente tu mejor opción. Creo que es un buen estilo, también. –

+0

¿Qué haces cuando quieres mantener 'Init' privado en C++? o cuando no puedes modificar la clase en absoluto? – MasterMastic

0

Para llamar a un constructor de clase Java desde el código JNI de C++, necesita usar construcciones JNI aquí. Suponiendo que usted ha pasado una referencia a la JVM con JNIEnv en su función como esto ++ C:

// Función declaración

void Java_com_hunter_mcmillen_Arbitrator (JNIEnv *env, jobject thiz) {

// referencia a la clase de Java que tiene su método

jclass itemClazz = env->FindClass("com/hunter/mcmillen/myjava/myclasses/Arbitrator");

// referencia al método en la clase java

jmethodID constructor = env->GetMethodID(itemClazz, "<init>", "(Ljava/lang/Object;Ljava/lang/Object)V");

}

Y ahora en realidad se puede llamar a la función constructora en su código C++.

Cuestiones relacionadas