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.
- La compilación con NDK da error para los archivos de encabezado incluidos correctamente
- ¿Cómo puedo copiar mis bibliotecas .so en el dispositivo Android?
- Generación de archivos .so en Android Studio 1.0.2 con NDK
- Convierta C.jstring a cadena nativa en Go
- Código java para leer la imagen en lugar de obtener el marco
* 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 ++.
- Cómo escribir y leer bytebuffer pasar de java a jni
- ¿Cómo utilizar Java con NDK Android?
- Android JNI nativo C función llamada mata actividad
- Android NDK desborda la tabla de referencia local JNI de dalvik
- Android MediaRecorder para grabar una superficie (no la cámara)
- Uso de bibliotecas pre-construidas y jni en Android Studio
- Pasar una cadena al código C en Android NDK
- Uso de Fluidsynth para reproducir notas de SoundFonts en Android
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 */ }
- Error: Android-XML: Colocar un <WebView> en un elemento padre que utiliza un tamaño wrap_content puede llevar a errores sutiles; Utilizar match_parent
- ¿Cómo ocultar el teclado virtual al cambiar las pestañas?