JNI cambiar C a C ++

Tengo un código simple que quiero usar en mi aplicación java (android):

#include <string.h> #include <jni.h> jstring Java_com_example_ndk_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz) { return (*env)->NewStringUTF(env, "Hello from JNI !"); } 

Si utilizo C y llamo a este archivo * .c – todo está bien, pero quiero este código en C ++, renombro este archivo a * .cpp (y cambia Android.mk). Todo se compila pero cuando intento utilizar esta función de la manera que lo he usado en C, tengo un error.

* También modifico el cuerpo de la func:

  return env->NewStringUTF("Hello from JNI !"); 

Trate de usar esto:

 public native String stringFromJNI(); static { System.loadLibrary("hello-jni"); } 

Y tiene un error:

 09-10 17:55:46.410: W/dalvikvm(6339): No implementation found for native Lcom/example/ndk/MainActivity;.stringFromJNI ()Ljava/lang/String; 09-10 17:55:46.410: E/AndroidRuntime(6339): java.lang.UnsatisfiedLinkError: stringFromJNI 09-10 17:55:46.410: E/AndroidRuntime(6339): at com.example.ndk.MainActivity.stringFromJNI(Native Method) 09-10 17:55:46.410: E/AndroidRuntime(6339): at com.example.ndk.MainActivity.onCreate(MainActivity.java:22) 

No puedo entender por qué el mismo código se ejecuta en C y falla (tiempo de ejecución) en C ++.

Para permitir la sobrecarga de funciones, C ++ utiliza algo llamado mangling nombre . Esto significa que los nombres de funciones no son los mismos en C ++ como en C. normal.

Para inhibir este nombre mangling, tienes que declarar funciones como extern "C" :

 extern "C" jstring Java_com_example_ndk_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz) { return (*env)->NewStringUTF(env, "Hello from JNI !"); } 

Para utilizar las convenciones de llamada C en código C ++ , rodee sus funciones con:

 extern "C" { /* your C API */ } 
  • Matriz de bytes de retorno en jni android?
  • UnsatisfiedLinkError (Método nativo no encontrado)
  • Convertir de YUV a RGB en c + + (android-ndk)
  • JNI: Cómo obtener el tamaño jbyteArray
  • Cómo eliminar soporte nativo de un proyecto de Android en eclipse porque eclipse está mostrando errores en jni?
  • Detenga el subproceso Java que llama a la función JNI
  • Java: acceso al campo final estático en JNI
  • ¿Cómo compartir una variable entre Java y C en android JNI?
  • Biblioteca binaria preconfigurada nativa en Android Studio con el complemento experimental de Gradle
  • ¿Cuál es la forma correcta de usar v8 :: Locker, y por qué debo usarlo?
  • Android: Calling System.loadLibrary () hace que el proceso muera
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.