2012-02-01 8 views
5

Tengo una función de Java que devuelve una instancia singleton de una ClaseJNI llamada a la función de Java devolver un resultado objeto en NoSuchMethodError

public static synchronized MyClass getInstance() throws MyClassException{ 
    if (instance == NULL){ 
     // create 
    } 
    return instance; 
} 

quiero llamar a esto a través de código C++, pero cuando lo hago, devuelve un NoSuchMethodError.

cls = jenv->FindClass("MyClass"); 
if (cls == NULL) 
{ 
//error handling 
} 
mid = jenv->GetStaticMethodID(cls, "getInstance", "()LMyClass"); 
if (mid == NULL) 
{ 
//error handling 
} 

cuando corro:

javap -s -p on MyClass, I get the signature: 
public static synchronized MyClass getInstance() throws MyClassException; 
Signature:()LMyClass; 

Si cambio de la firma de la función de anular en la clase de Java, la llamada GetStaticMethodID funciona como se esperaba.

¿Necesito configurar un proyecto para esperar el valor de retorno de la llamada?

¿Es esto posible sin llamar primero a GetStaticMethodID?

+0

¿Dónde está la llamada que devuelve el error? –

+0

Cuando ejecuto la aplicación C++, obtengo: Excepción en el hilo "principal" java.lang.NoSuchMethodError: getInstance – donalmg

+0

Me pregunto si necesita especificar la ruta completa a "MyClass" en la llamada a GetStaticMethodId. Por ejemplo: jenv-> GetStaticMethodID (cls, "getInstance", "() Lcom/work/MyClass;"); Dependiendo de dónde vive el código CPP en relación con el código Java? Solo un pensamiento. – eternaln00b

Respuesta

1

Creo que el problema es que no puede resolver el argumento de salida especificado. Si su clase Java estuviera en el paquete: "com/work /", usted diría:

jenv->GetStaticMethodID(cls, "getInstance", "()Lcom/work/MyClass;"); 

Eso debería hacerlo.

EDIT:

Parece que la respuesta está en la salida de javap ¿verdad? Debería estar haciendo:

jenv->GetStaticMethodID(cls, "getInstance", "()LMyClass;"); 
+0

Typo en mi pregunta original. Tenía esto como **() LMyClass ** – donalmg

+0

Y explícitamente dijo "() LMyClass;" con el punto y coma al final? – eternaln00b

+0

Por ejemplo, puedo hacer: getStaticMethodID (cls, "currentThread", "() Ljava/lang/Thread;"); Y eso funciona bien. Eso funciona para ti? – eternaln00b

Cuestiones relacionadas