studio programming ndk ejecutar developers descargar c++ android c jni android-ndk

c++ - programming - kotlin



Usa C++ con Android ndk/jni (6)

error: expected ''='', '','', '';'', ''asm'' o ''__ attribute __'' antes de ''clase''

Caso clásico de desaparecidos '';'' antes de la palabra clave class? Imagina

int functionname(int p) class X { } ;

Esto podría conducir a su mensaje de compilación con bastante facilidad. Un factor de complicación común es cuando realmente se ve como

#include "someheader.h" class X { } ;

y el error está en la última declaración dentro de someheader.h / o cualquier archivo incluido recursivamente /;)

Todas las muestras ndk solo hacen uso de funciones C básicas declaradas como extern en el encabezado y definidas en el archivo cpp. Luego, después de incluir el archivo de encabezado en el archivo C que contiene la devolución de llamada jni, todo funciona bien.

¿Es posible usar clases de C ++ con el ndk de Android? Mi aplicación no va a ser una actividad nativa, todavía tendrá una parte importante de Java, pero llamará al código C nativo para el cómputo intensivo de CPU (ya escrito en C ++, con clases y otras cosas de C ++).

Aquí está mi hola del mundo hello por ahora:

Archivo "first.h"

#ifndef FIRST_H #define FIRST_H class Test {}; #endif /* FIRST_H */

Archivo "second.cpp"

#include <jni.h> #include "first.h" #ifdef __cplusplus extern "C" { #endif jint Java_com_example_twolibs_TwoLibs_add( JNIEnv* env, jobject this, jint x, jint y ) { Test t; return 0; } #ifdef __cplusplus } #endif

Y finalmente Android.mk

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := libtwolib-second LOCAL_SRC_FILES := second.cpp include $(BUILD_SHARED_LIBRARY)

Bastante básico pero eso no compila. Convertir el segundo.cpp en un archivo .c genera un error al incluir el archivo de encabezado, supongo que esto se debe a que no es un archivo C ++.

error: expected ''='', '','', '';'', ''asm'' or ''__attribute__'' before ''Test''

Hacerlo .cpp genera el siguiente error:

make: *** No rule to make target `/cygdrive/c/android-ndk-r5c/samples/twolibs/jni/second.c'', needed by `/cygdrive/c/android-ndk-r5c/samples/two-libs/obj/local/armeabi/objs/twolib-second/second.o''. Stop.

¿Alguna idea de cómo puedo hacer que compilara?

Gracias


Acerca de su error de compilación, parece que primero lo llamó "second.c" y luego lo renombró como "second.cpp", pero los archivos objeto todavía tienen el nombre "second.c" en ellos, así que antes de compilar (bdk-build) necesita eliminar los archivos * .o y * .d en / cygdrive / c / android-ndk-r5c / samples / two-libs / obj / local / armeabi / objs / twolib-second / directory


Correr:

ndk-build clean

después de modificar un Android.mk incorrecto, o la compilación puede continuar fallando incluso si ha arreglado la configuración.

Creo que esto es lo que el OP significó en este comentario .


Deberá recompilar todas las bibliotecas nativas específicamente para Android. Necesitas el código fuente para todas las librerías nativas de terceros que planeas usar simplemente porque generalmente cuando compilamos y vinculamos estas bibliotecas fuera de Android están vinculadas a glibc pero desafortunadamente Android no usa glibc debido a problemas de fallas y rendimiento. Android usa una versión diluida de glibc llamada libc . Tiene nombres de símbolos coincidentes para glibc para la mayoría de las funcionalidades habituales. Pero hasta donde sé, la libc no tiene alguna funcionalidad relacionada con las strings y definitivamente no tiene soporte posix . Si sus bibliotecas nativas están utilizando alguna de las funciones obsoletas, tendrá que encontrar una solución alternativa para esas mediante el uso de una funcionalidad alternativa compatible con libc y la codificación de sus libs en consecuencia.

Además, como correctamente señaló, deberá usar el NDK para conectar Java (aplicación Android / fwk) al mundo nativo (C ++).

Aunque esto suena bastante simple en mi experiencia, la compilación de librerías nativas en Android (portado de Android) ha llevado mucho tiempo sin garantía de éxito.


Editar Android.mk

Modifique las instancias de LOCAL_SRC_FILES y elimine ./ desde el inicio de cada línea.


Puede usar C ++ con NDK, pero los archivos con código C ++ deben tener la extensión .cpp.

De ANDROID-MK.html :

Tenga en cuenta que la extensión predeterminada para los archivos fuente de C ++ es ''.cpp''. Sin embargo, es posible especificar uno diferente definiendo la variable LOCAL_CPP_EXTENSION. No olvides el punto inicial (es decir, ''.cxx'' funcionará, pero no ''cxx'').