2010-10-27 11 views
19

Tengo una implementación en funcionamiento de la biblioteca NDK y la correspondiente clase Java. Pero no puedo agregar el método sobrecargado a esa clase. Actualmente mi clase contiene:¿Cuál es la forma correcta de escribir firmas de métodos nativos en Android NDK?

package com.package; 

public class MyClass 
{ 
    public static native String getFileName(); 
    static 
    { 
    System.loadLibrary("mylib"); 
    } 
} 

Mi archivo jniwrappers.cpp tiene la siguiente declaración:

bien
JNIEXPORT jstring JNICALL 
Java_com_package_MyClass_getFileName(_JNIEnv* env, jobject thiz); 

Hasta este punto todo está funcionando. Pero la próxima modifico mi clase:

package com.package; 

public class MyClass 
{ 
    public static native String getFileName(); 
    public static native String getFileName(int index); 
    ... 
} 

y añadir a jniwrappers.cpp otra declaración:

JNIEXPORT jstring JNICALL 
Java_com_package_MyClass_getFileName__I(_JNIEnv* env, jobject thiz, jint index); 

compila, se inicia la aplicación Android finas, no recibe UnsatisfiedLinkError pero cuando se llama al método con el segundo el argumento de que se llama a la primera función de C++ pero no a la segunda. Tengo otros métodos con argumentos en esa clase, pero ninguno de ellos está sobrecargado, por lo que sus respectivas firmas JNI no contienen argumentos.

Entonces, ¿qué estoy haciendo mal?

Respuesta

20

hay que añadir un __ al final de la función getFileName original, ahora que se está sobrecargado. Sus prototipos de funciones C 2 debe parecerse a esto:

JNIEXPORT jstring JNICALL Java_com_package_MyClass_getFileName__ 
    (JNIEnv *, jclass); 

JNIEXPORT jstring JNICALL Java_com_package_MyClass_getFileName__I 
    (JNIEnv *, jclass, jint); 
+0

Esto fue lo primero que probé, pero algo salió mal y tengo UnsatisfiedLinkError. Ahora he vuelto a intentar esto y tengo todo funcionando. ¡Muchas gracias! –

25

Debe utilizar javah herramienta para generar esas firmas.

Para usarlo, construir el archivo de clase donde tiene su función native. Obtendrás un archivo class.

Run javah -jni com.organisation.class_with_native_func, que va a generar un archivo de cabecera para usted.

Es mucho más limpio que editarlo usted mismo.

+3

Gracias, eso es lo que debería usar. Pero aún conocer las partes internas es muy útil. –

+0

O simplemente use el modificador de línea de comando -classpath para dirigir javah al directorio donde se compila el archivo de clase (es decir: 'javah-classpath/path/to/jar -jni com.package.name.YourClass'). –

Cuestiones relacionadas