android - tutorial - Eclipse compila con éxito pero aún da errores semánticos
opencv android tutorial español (8)
¡Acabo de pasar 3 horas golpeando mi cabeza contra este problema de indexación Eclipse NDK!
Lo que lo hizo funcionar: asegúrese de tener solo UNA arquitectura de CPU especificada en Su archivo Application.mk.
De lo contrario, la compilación NDK no generará el archivo .metadata / .plugins / com.android.ide.eclipse.ndk / *. PathInfo. Este archivo contiene valores incorporados desde Proyecto -> Propiedades -> C / C ++ General -> Rutas y símbolos -> Incluye (solo hacer que el archivo .pathInfo no solucione el problema)
NOTA: aparentemente es una pregunta recurrente en StackOverflow, pero, por lo que he visto, las personas nunca encuentran una manera o su solución no funciona para mí
El problema:
Estoy usando Eclipse Juno ADT. Todo estaba funcionando bien hasta que intenté actualizar el NDK. ndk
mi carpeta ndk
(que era el ndk-r8d
) por la nueva versión (es decir, ndk-r8e
) y, en la configuración de Mis Paths and Symbols
, cambié el ndk-r8e
para pasar de g ++ 4.6 a 4.7.
Parecía romper mi índice: podía compilar mi código, pero Eclipse estaba dando errores semánticos, exactamente como en [ 1 ] y [ 2 ]. Los errores provienen principalmente del símbolo utilizado por OpenCV4Android, como distance
, pt
, queryIdx
y trainIdx
.
Cuando intenté hacer una copia de seguridad de mi configuración anterior, ¡el índice todavía estaba roto! No puedo encontrar una manera de cambiar esto.
Lo que he intentado
- Limpiar el proyecto
- Reconstruya, actualice y todas las demás opciones en el submenú "Índice" (cuando "haga clic con el botón derecho" en el proyecto)
- Desactivar / habilitar el indexador en las preferencias
- Verifique que los símbolos tales como
trainIdx
solo aparecen en mi OpenCV4Android incluyen en la sección dePaths and Symbols
. - Cambie el orden de mis inclusiones en la sección
Paths and Symbols
. Básicamente traté de incluir el OpenCV al principio y al final.
Algunas observaciones
Lo que no funciona
Supongo que es el índice CDT debido a lo siguiente:
- En la línea de comando, puedo construir mi proyecto usando
ndk-build clean
yndk-build
. - Cuando inicio Eclipse, no tengo ningún error hasta que abra un archivo C ++ (desde la carpeta
jni
). - Siempre puedo construir el proyecto, pero siempre que haya abierto un archivo C ++, ya no puedo ejecutar la aplicación debido a que una gran cantidad de
Field ''<name>'' could not be resolved.
- Si no abro los archivos C ++, Eclipse no informa ningún error y puede compilar e implementar la aplicación Android con éxito.
Dato interesante
El siguiente código informa errores en line
, queryIdx
, pt
:
cv::line(mRgb, keypointsA[matches[i].queryIdx].pt, keypointsB[matches[i].trainIdx].pt, cv::Scalar(255, 0, 0, 255), 1, 8, 0);
Si lo escribo de la siguiente manera, funciona:
cv::DMatch tmpMatch = matches[i];
cv::KeyPoint queryKp = keypointsA[tmpMatch.queryIdx];
cv::KeyPoint trainKp = keypointsB[tmpMatch.trainIdx];
cv::line(mRgb, queryKp.pt, trainKp.pt, cv::Scalar(255, 0, 0, 255), 1, 8, 0);
No es que todas las funciones de OpenCV estén sin resolver: solo son pt
, queryIdx
y trainIdx
.
Cualquier comentario será realmente apreciado.
Dado que la indexación para el código nativo de Android en Eclipse es incompleta, logré habilitar la indexación en mis proyectos NDK de la siguiente manera poco intuitiva, debería funcionar ya sea que utilice ndk-build
o plain make
o incluso cmake
. Estoy usando Kepler pero también debería funcionar en versiones anteriores.
Obtenga su cadena de herramientas correcta
- Haga clic derecho en el proyecto ->
Properties
->C/C++ Build
->Tool Chain Editor
-> DesmarqueDisplay compatible toolchains only
. - En la misma ventana, configure la
Current toolchain
deCurrent toolchain
enLinux GCC
. - En la misma ventana, configure el
Current builder
enAndroid Builder
si está usandondk-build
,ndk-build
enGnu Make Builder
contrario (este paso puede ser incorrecto, lo siento de antemano si es así). - Haga clic derecho en el proyecto ->
Properties
->C/C++ Build
->Build Variables
-> Asegúrese de que elBuild command
lea el comando correcto para su proyecto; si no lo está, desmarqueUse default build command
yndk-build
(puede serndk-build
omake -j5
que desee). Si construye el código nativo en un terminal separado, puede omitir este paso.
Cree una cadena de herramientas independiente, probablemente sea la forma más limpia de obtener fuentes STL en un solo lugar
- Ve al directorio raíz de NDK.
Ejecute lo siguiente (modifique la configuración de acuerdo con su gusto). Agregue
sudo
si no tiene permisos de escritura en el--install-dir
porque el script falla silenciosamente../build/tools/make-standalone-toolchain.sh / --platform=android-14 / --install-dir=/opt/android-toolchain / --toolchain=arm-linux-androideabi-4.8
Esto es asumiendo que usas GNU-STL. Si usa otra biblioteca de C / C ++, necesitará modificar el comando anterior, y probablemente también las rutas incluidas en el siguiente comando.
Agregue las rutas de inclusión necesarias a su proyecto
Haga clic derecho en proyecto ->
Properties
->C/C++ General
->Paths and Symbols
-> Vaya a la pestañaIncludes
-> SeleccioneGNU C++
desdeLanguages
-> Haga clic enAdd
y agregue las siguientes rutas (suponiendo que instaló la cadena de herramientas independiente en/opt/android-toolchain
):-
/opt/android-toolchain/include/
-
/opt/android-toolchain/include/c++/4.8/
-
/opt/android-toolchain/include/c++/4.8/arm-linux-androideabi/
-
/opt/android-toolchain/lib/gcc/arm-linux-androideabi/4.8/include/
-
/opt/android-toolchain/include/c++/4.8/backward/
-
/opt/android-toolchain/lib/gcc/arm-linux-androideabi/4.8/include-fixed/
-
/opt/android-toolchain/sysroot/usr/include/
-
Aquí, puede agregar cada ruta de inclusión que desee. De hecho, tengo mi OpenCV construido para Android e instalado en la cadena de herramientas independiente, por lo que tengo los siguientes incluir allí:
-
/opt/android-toolchain/sysroot/usr/share/opencv/sdk/native/jni/include/
-
Ahora, la indexación debería funcionar. También debería poder ejecutar ndk-build
(o make
si ese es su método de compilación) y luego implementar su proyecto en su dispositivo dentro de Eclipse.
¿Por qué?
El desarrollo nativo de Android en Eclipse está incompleto ya que la indexación no funciona de la caja. Esto se debe a tener que admitir varias arquitecturas (ARMv7, Intel, etc.), múltiples opciones de STL, múltiples versiones de Android, etc. Esta es la razón por la cual tienes el ndk-build
basado en ndk-build
y la estructura NDK completa, y esta es también la razón por la cual NDK el desarrollo es muy sucio y existen pocos proyectos Android nativos de gran volumen.
Un gran proyecto de Android es OpenCV, donde tuvieron que desarrollar 1500 secuencias de comandos de CMake para compilar para Android correctamente. En algún momento, trataron de exportar ese script como un sistema de compilación basado en CMake para Android, pero no pudo mantenerse al día con los cambios en el sistema NDK y fue abandonado. Este soporte debería haber estado dentro de NDK.
El sistema de compilación NDK predeterminado debería haber sido una cadena de herramientas independiente, con todas las diferentes arquitecturas / bibliotecas C ++ que tienen sus propias cadenas de herramientas a costa del espacio de almacenamiento, pero con la ventaja de la limpieza, la intuición y las buenas prácticas. Entonces puede incorporar cualquier sistema de compilación cruzada estándar que también se use en otros lugares, se pruebe y sea conocido, por ejemplo, CMake. Puedes, y en mi opinión deberías, hacerlo con el comando make-standalone-toolchain
del NDK como se muestra arriba. Pero al final, esta es solo mi opinión. Si te sientes lo suficientemente cómodo con ndk-build
entonces adelante.
En las preferencias de proyecto seleccionadas en el entorno de Eclipse, vaya a C / C ++ General -> Análisis de código -> Inicio. Asegúrese de que ambas casillas de verificación estén desmarcadas. Cierre y vuelva a abrir el proyecto o reinicie Eclipse y reconstruya el proyecto.
En realidad es bastante difícil decir cuál es el problema. Aquí hay algunos consejos:
- Intenta importar y compilar
hello-jni
(se encuentra en la carpeta desamples
jni
). Si funciona sin problemas, el problema es vincular OpenCV a su proyecto. - Parece que olvidó actualizar la ubicación de
android-ndk
en lasproject properties -> c/c++ build -> environment
. Aquí hay un enlace al problema Problema con el proyecto de compilación Android NDK . - Cree desde la consola su proyecto (
ndk-build -B
), borre todos los errores en Eclipse manualmente (en la vista deProblems
, seleccione todos los errores y simplemente haga clic en eliminar ) e intente ejecutar el proyecto ahora. A veces este "truco" me ayuda a ejecutar el proyecto. - Cierre Eclipse y elimine la carpeta
path-to-your-workspace/.metadata/.plugins/org.eclipse.cdt.core
(path-to-your-workspace/.metadata/.plugins/org.eclipse.cdt.core
copia de seguridad primero).
Tuve el mismo problema, como muchas personas.
Seguí los pasos en la publicación de Ayberk Özgür, lo cual tiene mucho sentido. Aunque también tuve que asegurarme de poner incluye en los tres idiomas: GNU C, GNU C ++ y Assembly. Probablemente porque no estoy usando una cadena de herramientas independiente.
Al principio tenía mi incluye solo bajo GNU C y GNU C ++. Lo que me dejó todavía con el error incluye no resuelto. No fue hasta que asigné mi inclusión en el lenguaje Assembler como mis errores desaparecieron.
No sé por qué eclipse solo está buscando a través de Assembler en mi proyecto. Tampoco sé cómo esta parte de la solución funcionará para proyectos más grandes y complicados.
Espero que esto ayude.
Tuve el mismo problema. Tenía todas las rutas de acceso de inclusión adecuadas pero después de abrir el archivo .c / .cpp o .h y comenzaría a marcar todo como "Sin resolver".
Esto funcionó para mí ...
Ir:
PREFERENCIAS -> C / C ++ -> INDEXER
Compruebe el origen del índice y los archivos de encabezado abiertos en el Editor .
Tuve la misma situación con Eclipse CDT trabajando con la biblioteca OpenCV. Recibí varios mensajes de error mientras el programa se compilaba correctamente. Cambié la configuración del indexador en "ventana-> preferencias-> indexador" "configuración de compilación para indexador" a "Usar configuración activa", que resolvió mi problema.
Vaya a Preferencias> C / C ++> Asignación de idioma> AGREGAR (archivo de origen C y seleccione GNU C) Haga lo mismo para C ++