Eclipse comstack con éxito pero aún da errores semánticos

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 comstackr 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 de Paths 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 y ndk-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 '' could not be resolved.
  • Si no abro los archivos C ++, Eclipse no informa ningún error y puede comstackr 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.

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.

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 -> Desmarque Display compatible toolchains only .
  • En la misma ventana, configure la Current toolchain de Current toolchain en Linux GCC .
  • En la misma ventana, configure el Current builder en Android Builder si está usando ndk-build , ndk-build en Gnu 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 el Build command lea el comando correcto para su proyecto; si no lo está, desmarque Use default build command y ndk-build (puede ser ndk-build o make -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 fonts 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-androidabi-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ña Includes -> Seleccione GNU C++ desde Languages -> Haga clic en Add 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-androidabi/
    • /opt/android-toolchain/lib/gcc/arm-linux-androidabi/4.8/include/
    • /opt/android-toolchain/include/c++/4.8/backward/
    • /opt/android-toolchain/lib/gcc/arm-linux-androidabi/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 comstackció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 architectures (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 comstackr para Android correctamente. En algún momento, trataron de exportar ese script como un sistema de comstackció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 comstackción NDK predeterminado debería haber sido una cadena de herramientas independiente, con todas las diferentes architectures / 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 comstackció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 realidad es bastante difícil decir cuál es el problema. Aquí hay algunos consejos:

  1. Intenta importar y comstackr hello-jni (se encuentra en la carpeta de samples jni ). Si funciona sin problemas, el problema es vincular OpenCV a su proyecto.
  2. Parece que olvidó actualizar la ubicación de android-ndk en las project properties -> c/c++ build -> environment . Aquí hay un enlace al problema Problema con el proyecto de comstackción Android NDK .
  3. Cree desde la consola su proyecto ( ndk-build -B ), borre todos los errores en Eclipse manualmente (en la vista de Problems , 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.
  4. 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).

Vaya a Preferencias> C / C ++> Asignación de idioma> AGREGAR (archivo de origen C y seleccione GNU C) Haga lo mismo para C ++

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 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 la misma situación con Eclipse CDT trabajando con la biblioteca OpenCV. Recibí varios mensajes de error mientras el progtwig se comstackba correctamente. Cambié la configuración del indexador en “ventana-> preferencias-> indexador” “configuración de comstackción para indexador” a “Usar configuración activa”, que resolvió mi problema.

¡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 architecture de CPU especificada en Su archivo Application.mk.

De lo contrario, la comstackció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)