NOTE: it apparently is a recurrent question on StackOverflow, but - for what I have seen - either people never find a way or their solution does not work for me
The problem:
I am using Eclipse Juno ADT. Everything was working fine until I tried to update the NDK. I replaced my ndk
folder (that was the ndk-r8d
) by the new version (i.e. ndk-r8e
) and, in my Paths and Symbols
configuration, I changed the includes to go from g++ 4.6 to 4.7.
It seemed to break my index: I could compile my code, but Eclipse was giving semantic errors, exactly like in [1] and [2]. The errors mainly come from symbol used by OpenCV4Android, such as distance
, pt
, queryIdx
and trainIdx
.
When I tried to backup to my old configuration, the index was still broken! I cannot find a way to change this.
What I have tried
- Clean up the project
- Rebuild, refresh, and all the other options in the "Index" submenu (when "right-clicking" on the project)
- Disable / enable the indexer in the preferences
- Verify that symbols such as
trainIdx
only appear in my OpenCV4Android include in thePaths and Symbols
section. - Change the order of my includes in the
Paths and Symbols
section. I basically tried to put the OpenCV include in the beginning and in the end.
Some observations
What is not working
I assume that it is the CDT index because of the following:
- In command line, I can build my project using
ndk-build clean
andndk-build
. - When I start Eclipse, I have no error until I open a C++ file (from the
jni
folder). - I can always build the project, but as long as I have opened a C++ file, I can't run the application anymore because of a lot of
Field '<name>' could not be resolved.
- If I don't open the C++ files, Eclipse doesn't report any error and can build and deploy the Android application successfully.
Interesting fact
The following code reports errors on 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);
If I write it as follows, it works:
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);
It is not that all of the OpenCV functions are unresolved: only pt
, queryIdx
and trainIdx
are.
Any comment will be really appreciated.
Go to Preferences > C/C++ > Language Mapping > ADD (Source C File and select GNU C) Do the same for C++
I just spent about 3h banging my head against this Eclipse NDK indexing issue!..
What made it work: make sure that you have only ONE cpu architecture specified in Your Application.mk file.
Otherwise the .metadata/.plugins/com.android.ide.eclipse.ndk/*.pathInfo file will not be generated by the NDK build. This file contains built-in values from Project -> Properties -> C/C++ General -> Paths and Symbols -> Includes (just making .pathInfo file does not fix the problem)
I had the similar situation with Eclipse CDT working with the OpenCV library. I got several error messages while the program compiled correctly. I changed the indexer setting in "window->preferences->Indexer" "build configuration for indexer" box to "Use Active Configuration" which solved my issue.
Since indexing for Android native code on Eclipse is incomplete, I managed to enable indexing in my NDK projects the following unintuitive way, it should work whether you use
ndk-build
or plainmake
or evencmake
. I'm using Kepler but it should work on older versions too.Get your toolchain right
Properties
->C/C++ Build
->Tool Chain Editor
-> UncheckDisplay compatible toolchains only
.Current toolchain
toLinux GCC
.Current builder
toAndroid Builder
if you're usingndk-build
, set it toGnu Make Builder
otherwise (this step may be wrong, sorry in advance if it is).Properties
->C/C++ Build
->Build Variables
-> Make sureBuild command
reads the correct command for your project; if it's not, uncheckUse default build command
and correct it (it may bendk-build
ormake -j5
that you want). If you build the native code in a separate terminal, you can skip this step.Make a standalone toolchain, it's probably the cleanest way to get STL sources in one place
Run the following (tweak the settings according to your liking). Add
sudo
if you don't have write permissions to the--install-dir
because the script fails silently.This is assuming that you use GNU-STL. If you use another C/C++ library, you will need to tweak the above command, and probably also the include paths in the next command.
Add the necessary include paths to your project
Right click on project ->
Properties
->C/C++ General
->Paths and Symbols
-> Go to theIncludes
tab -> SelectGNU C++
fromLanguages
-> ClickAdd
and add the following paths (assuming you installed the standalone toolchain to/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/
Here, you can add every include path you want. In fact, I have my OpenCV built for Android and installed in the standalone toolchain, so I have the following include there:
/opt/android-toolchain/sysroot/usr/share/opencv/sdk/native/jni/include/
Now, the indexing should work. You should also be able to run
ndk-build
(ormake
if that's your build method) and then deploy your project to your device inside Eclipse.Why?
Android native development on Eclipse is incomplete since the indexing doesn't work out of the box. This is due to having to support multiple architectures (ARMv7, Intel etc.), multiple STL options, multiple Android versions etc. This is why you have the bare
make
basedndk-build
and the whole NDK structure, and this is also why NDK development is very unclean and few large volume native Android projects exist.A big Android project is OpenCV where they had to develop a 1500 odd line CMake script to get it to compile for Android properly. At some point, they tried to export that script as a CMake based build system for Android but it couldn't keep up with the changes in the NDK system and was abandoned. This support should have been inside NDK itself.
The default NDK build system should have been standalone toolchain only, with all different architectures/C++ libraries having their own toolchains at the cost of storage space but with the advantage of cleanness, intuitiveness and good practice. Then you can incorporate any standard cross-compilation system that is also used elsewhere, is tested and is well-known, e.g CMake. You can, and in my opinion you should, do that with the NDK's
make-standalone-toolchain
command as shown above. But in the end, this is only my opinion. If you feel comfortable enough withndk-build
then go ahead.It's actually quite hard to say what is the problem. Here are some advices:
hello-jni
(it is located injni
'ssamples
folder). If it runs without problems than problem is with linking OpenCV to your project.android-ndk
location inproject properties -> c/c++ build -> environment
. Here's link to problem Issue with build Android NDK project.ndk-build -B
), delete all errors in Eclipse manually (inProblems
view select all errors and just click delete) and try to run project now. Sometimes this "hack" helps me to run project.path-to-your-workspace/.metadata/.plugins/org.eclipse.cdt.core
(backup it first).I had the same issue, like many people.
I followed the steps in Ayberk Özgür post, which make good sense. Although I also had to make sure to put includes under all three languages: GNU C, GNU C++, and Assembly. Probably because I'm not using a stand alone tool chain.
I at first had my includes only under GNU C and GNU C++ languages. Which left me still with the unresolved includes error. Not until I assigned my includes under the Assembler language as well did my errors go away.
I do not know why eclipse is only searching through the Assembler includes in my project. I also do not know how this part of the solution will work for bigger more complicated projects.
Hope this helps.