jni - plantillas - ¿Cuál es la forma correcta de escribir firmas de métodos nativos en Android NDK?
insertar imagen en firma mail mac (2)
Debe agregar un __
al final de la función getFileName original ahora que está sobrecargada. Sus prototipos de función 2 C ahora deberían verse así:
JNIEXPORT jstring JNICALL Java_com_package_MyClass_getFileName__
(JNIEnv *, jclass);
JNIEXPORT jstring JNICALL Java_com_package_MyClass_getFileName__I
(JNIEnv *, jclass, jint);
Tengo una implementación de trabajo de la biblioteca NDK y la clase Java correspondiente. Pero no puedo agregar el método sobrecargado a esa clase. Actualmente mi clase contiene:
package com.package;
public class MyClass
{
public static native String getFileName();
static
{
System.loadLibrary("mylib");
}
}
Mi archivo jniwrappers.cpp tiene la siguiente declaración:
JNIEXPORT jstring JNICALL
Java_com_package_MyClass_getFileName(_JNIEnv* env, jobject thiz);
Hasta este punto todo funciona bien. Pero a continuación modifico mi clase:
package com.package;
public class MyClass
{
public static native String getFileName();
public static native String getFileName(int index);
...
}
Y añada a jniwrappers.cpp otra declaración:
JNIEXPORT jstring JNICALL
Java_com_package_MyClass_getFileName__I(_JNIEnv* env, jobject thiz, jint index);
Se compila bien, la aplicación de Android se inicia, no obtiene UnsatisfiedLinkError pero cuando llama al segundo método con el argumento, se llama a la primera función de C ++ pero no al segundo. 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?
Debes usar la herramienta javah
para generar esas firmas.
Para usarlo, genere el archivo de clase donde tenga su función native
. Obtendrás un archivo de class
.
Ejecute javah -jni com.organisation.class_with_native_func
, generará un archivo de encabezado para usted.
Es mucho más limpio que editarlo tú mismo.