Зацьменне паспяхова кампілюецца, але па-ранейшаму дае сэнсавыя памылкі

Заўвага: гэта, відавочна, з'яўляецца чарговае пытанне на StackOverflow, але - за тое, што я бачыў - ні людзі ніколі не знайсці спосаб або іх рашэнне не працуе для мяне

Праблема:

Я выкарыстоўваю Eclipse, Juno ADT. Усё працавала выдатна, пакуль я не паспрабаваў абнавіць NDK. Я замяніў мой NDK тэчка (гэта быў NDK-R8d ) у новай версіі (г.зн. NDK-R8e ) і, на мой <�код > Шляхі і сімвалы канфігурацыі, я змяніў ўключае ў сябе, каб перайсці ад G ++ 4.6 да 4.7.

Здавалася, зламаць мой індэкс: <�моцны> Я мог бы скласці свой код, але Eclipse, даваў семантычныя памылкі, гэтак жа, як у [ 2 ]. памылкі у асноўным прыходзяць ад сімвала, які выкарыстоўваецца OpenCV4Android, такіх як адлегласць , пт , queryIdx і trainIdx .

Калі я паспрабаваў зрабіць рэзервовую копію маёй старой канфігурацыі, індэкс быў яшчэ парушаны! Я не магу знайсці спосаб, каб змяніць гэта.


Тое, што я спрабаваў

  • Ачыстка праекта
  • Rebuild, абнаўлення і ўсе астатнія параметры ў падменю «Index» (калі «правай кнопкай мышы» па праекце)
  • Адключыць/ўключыць індэксацыю ў наладах
  • Пераканайцеся ў тым, што знакі, такія як trainIdx з'яўляюцца толькі ў маім OpenCV4Android ўключыць у Paths і сімвалы <�код /> раздзеле.
  • Зменіце парадак майго ўключае ў Paths і сімвалы секцыі. Я ў асноўным спрабаваў паставіць OpenCV ўключыць у пачатку і ў канцы.

некаторыя назіранні

Што не працуе

Я мяркую, што гэта <�моцны> CDT індэкс з-за наступным:

  • In command line, I can build my project using ndk-build clean and ndk-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 '' 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.

цікавы факт

Наступны код паведамленні пра памылкі на радкі , queryIdx , пт :

cv::line(mRgb, keypointsA[matches[i].queryIdx].pt, keypointsB[matches[i].trainIdx].pt, cv::Scalar(255, 0, 0, 255), 1, 8, 0);

Калі я пішу гэта наступным чынам, яна працуе:

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);

Гэта не тое, што ўсе функцыі OpenCV застаюцца нявырашанымі: толькі пт , queryIdx і trainIdx ёсць.

Любы каментар будзе вельмі каштоўны.

38
Гэта ідэальны прыклад таго, што пытанне павінна каго-н быць. Nicely разрэзалі на «Праблему», «Што не працуе», «Тое, што я спрабаваў" і г.д. Магчыма, мы павінны ставіцца новыя рэгістрацыі да яго, у якасці прыкладу.
дададзена аўтар Mawg, крыніца
@blackbelt Blackbelt забяспечыла хуткае вырашэнне праблемы, калі гэта адбываецца з вамі яшчэ раз (і ёсць адзін запіс ці два, якія толькі турбуе вас).
дададзена аўтар Jay Snayder, крыніца
адкрыць праблемы перспектывы зацьмення. Ён павінен паказвае тоны памылак (запісы з чырвонымі маркерамі побач з кожнай запісам). Выдаліць усе запісы і аднавіць ваша прыкладанне. У мяне была такая ж праблема, і гэта сапраўды сумны
дададзена аўтар Blackbelt, крыніца

8 адказы

In your selected project preferences within the Eclipse environment, go to C/C++ General -> Code Analysis -> Launching. Make sure that both check boxes are unchecked. Close and reopen the project or restart eclipse and rebuild the project.

33
дададзена
Гэта не рашэнне <�я> сам па сабе </я>, але я павінен быў зрабіць гэта ў рэшце рэшт.
дададзена аўтар JonesV, крыніца
Гэта не вырашае праблему, але яна «хавае», праўда?
дададзена аўтар JonesV, крыніца
Так, аналізатар кода на лета для Android НКУ ў Eclipse, здаецца, яшчэ не паспелі.
дададзена аўтар Alex Cohn, крыніца
@AlexCohn +1 хай дабраславіць вас Бог, гэтае пытанне адвёз мяне з розуму для поўнага дня
дададзена аўтар Shmil The Cat, крыніца
яго рашэнне "цяпер"
дададзена аўтар M. Usman Khan, крыніца

Паколькі індэксаванне для Android натыўнага кода на Eclipse, з'яўляецца няпоўным, мне ўдалося ўключыць індэксаванне ў маіх НКА праектаў, наступны неинтуитивный шляхам, ён павінен працаваць, карыстаецеся Ці вы NDK-зборку або просты зрабіць </код > ці нават CMake . Я выкарыстоўваю Кеплер, але ён павінен працаваць на старыя версіі таксама.

Атрымаеце ToolChain права

  • Right click on project -> Properties -> C/C++ Build -> Tool Chain Editor -> Uncheck Display compatible toolchains only.
  • In the same window, set Current toolchain to Linux GCC.
  • In the same window, set Current builder to Android Builder if you're using ndk-build, set it to Gnu Make Builder otherwise (this step may be wrong, sorry in advance if it is).
  • Right click on project -> Properties -> C/C++ Build -> Build Variables -> Make sure Build command reads the correct command for your project; if it's not, uncheck Use default build command and correct it (it may be ndk-build or make -j5 that you want). If you build the native code in a separate terminal, you can skip this step.

Зрабіць аўтаномны набор інструментаў, гэта, верагодна, самы чысты спосаб атрымаць крыніцы STL ў адным месцы

  • Go to the NDK root directory.
  • 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.

        ./build/tools/make-standalone-toolchain.sh \
            --platform=android-14 \
            --install-dir=/opt/android-toolchain \
            --toolchain=arm-linux-androideabi-4.8
    
  • 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.

Дадайце уключаючы неабходныя шляху да вашага праекту

  • Right click on project -> Properties -> C/C++ General -> Paths and Symbols -> Go to the Includes tab -> Select GNU C++ from Languages -> Click Add 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/

Цяпер, індэксацыя павінна працаваць. Вы таксама павінны быць у стане выканаць NDK-зборкі (ці зрабіць калі гэта ваш метад зборкі), а затым разгарнуць ваш праект на прыладу ўнутры Eclipse.

Чаму?

Android родная распрацоўка ў Eclipse, з'яўляецца няпоўнай, паколькі індэксацыя не працуе з скрынкі. Гэта адбываецца з-за таго, каб падтрымліваць некалькі архітэктур (ARMv7, Intel і г.д.), некалькі варыянтаў STL, некалькі версій Android і г.д. Менавіта таму ў вас ёсць голы зрабіць на аснове NDK-зборкі і ўся структура НДК, і гэта таксама, чаму развіццё NDK вельмі нячыста і існуе некалькі вялікіх тамоў роднай Android праектаў.

Вялікі Android праект OpenCV, дзе яны павінны былі распрацаваць 1500 няцотныя радкі CMake скрыпт, каб атрымаць яго, каб сабраць для Android належным чынам. У нейкі момант, яны спрабавалі экспартаваць гэты сцэнар як сістэмы зборкі на аснове CMake для Android, але ён не можа ісці ў нагу са зменамі ў сістэме НДК і быў пакінуты. Гэтая падтрымка павінна быць унутры самой НДК.

NDK сістэма зборкі па змаўчанні павінна быць толькі аўтаномныя набору інструментаў, усе розныя архітэктуры/бібліятэкі C ++, якія карыстаюцца ўласнай кампіляваць інструменты па кошту месцы для захоўвання, але з перавагай чысціні, інтуітыўнасць і добрай практыкай. Затым вы можаце ўключыць любую стандартную сістэму крос-кампіляцыі, якая таксама выкарыстоўваецца ў іншых месцах, выпрабоўваецца і добра вядомыя, напрыклад CMake. Вы можаце, і, на маю думку, вы павінны зрабіць гэта з НДК ў макіяж аўтаномны-ToolChain як паказана вышэй. Але ў рэшце рэшт, гэта толькі маё меркаванне. Калі вы адчуваеце сябе дастаткова камфортна NDK-зборкі затым ісці наперад.

10
дададзена
Дарэчы, на незвязанай тэму, зрабіце Yourselves ласку і перайсці да Vim + YCM для Сп развіцця/++. Eclipse, сапраўды не з'яўляецца добрым інструментам для гэтага.
дададзена аўтар Ayberk Özgür, крыніца
З іншага тэме, што CMake адаптацыя з'яўляецца адзін я казаў у арыгінальны адказ: Ён экспартуецца са сцэнара OpenCV Android CMake і апошні комм быў на 2012 арыгінальны сцэнар (можна знайсці ў OpenCV РЭПО) эвалюцыянавала і распрацаваў шмат з таго часу. Але падобнае (але значна прасцей) функцыянальнасць можа быць дасягнута з 5 лініі CMake ToolChain сцэнара ў тым, што адрознівае ваш SYSROOT.
дададзена аўтар Ayberk Özgür, крыніца
Не кажучы ўжо пра тое, што я перашкоджу мойму APK ад ўздуцці жывата з MIPS натыўнымі бібліятэкамі, якія ў канчатковым рахунку працуюць на 5 Усяго прылады пры разгортванні. Гэта тое, што большасць распрацоўшчыкаў дадаткаў робяць ( forum.xda-developers.com/showthread .php? т = 1385493 ), і я цалкам разумею і падтрымліваю іх вырашэнне.
дададзена аўтар Ayberk Özgür, крыніца
Я магу зразумець жаданне пабудаваць адначасова для некалькіх архітэктур, але большасць Android прылад ARMv7 з Intel, якія ўваходзяць у галіне зусім нядаўна. У горшым выпадку, я хацеў бы выкарыстаць дзве аўтаномныя кампіляваць інструменты для ARMv7 і x86 разам з маім ўжо уключаным CMake праекта (што я магу скампіляваць для хаста ці якой-небудзь іншай мэты, крос-платформавы я хачу, не мяняючы ні аднаго радка ў маім кодзе скрыптоў/) і грэбаванне ўсе іншыя архітэктуры (напрыклад, MIPS або ARMv5, які практычна састарэў), чым з дапамогай NDK-зборкі і яго Makefiles што старажытная тэхналогія сама па сабе.
дададзена аўтар Ayberk Özgür, крыніца
Гэта мае сэнс. Тым не менш, я лічу, што, бачачы C ++ падтрымліваюць неістотнага ў пачатку проста наіўна. Вазьміце гульні, напрыклад, відавочна, што яны з'яўляюцца вялікай часткай мабільнага свету прыкладанняў, і яны практычна% 99 натыўны код. Ёсць, верагодна, іншыя прыкладання там (напрыклад, які ў апрацоўку малюнкаў або выкарыстоўваюць візуальныя эфекты), якія падобныя. Такім чынам, у рэшце рэшт, яны павінны былі забяспечыць надзейную і лёгкую падтрымку роднай развіцця.
дададзена аўтар Ayberk Özgür, крыніца
Я думаю, што галоўная <�я> сэнс існавання з Android.mk і ўся сістэма NDK-зборкі ў тым, што ён быў выразаны з дрэва Android сістэмы. Па-першае, Google не думаю, што людзі будуць мець патрэбу ў C/C ++ для сваіх прыкладанняў на ўсіх, толькі сістэмныя бібліятэкі. Пазней, яны забяспечылі NDK, але яна па-ранейшаму забруджаныя інструментамі, якія маюць дачыненне толькі для стварэння сістэмы дрэва.
дададзена аўтар Alex Cohn, крыніца
Ну, NDK каля '14 значна, значна больш надзейны, шматфункцыянальны і просты, чым 3 гады таму. Я павінен сказаць, што я не магу пагадзіцца з вашымі перавагамі ў аўтаномны набор інструментаў. Гэта ідэальна падыходзіць для партоў велізарных існуючых праектаў замыкальныя на аснове, але ён не адказвае на неабходнасць кампіляваць для рукі/MIPS/x86 і г.д. Я лічу, што для дамарослых праектаў, гэта акупляецца, каб наладзіць іерархіі файлаў і дазваляе хутка і лёгка NDK-зборкі . Дарэчы, ёсць вельмі карысна CMake прыстасаванне для Android NDK . Ён выкарыстоўваць асобны набор інструментаў.
дададзена аўтар Alex Cohn, крыніца
Вялікая прычына адначасовага стварэння з'яўляецца ARM, x86 для сімулятара і прылады. Вы можаце выкарыстоўваць ARM для абодвух, але затым эмулятар так павольна вы ў канчатковым выніку заўсёды на прыладзе.
дададзена аўтар Cameron Lowell Palmer, крыніца

Гэта на самай справе вельмі цяжка сказаць, што гэта праблема. Вось некалькі саветаў:

  1. Try to import and build hello-jni (it is located in jni's samples folder). If it runs without problems than problem is with linking OpenCV to your project.
  2. It seems that you forgot to update android-ndk location in project properties -> c/c++ build -> environment. Here's link to problem Issue with build Android NDK project.
  3. Build from console your project (ndk-build -B), delete all errors in Eclipse manually (in Problems view select all errors and just click delete) and try to run project now. Sometimes this "hack" helps me to run project.
  4. Close Eclipse and delete folder path-to-your-workspace/.metadata/.plugins/org.eclipse.cdt.core (backup it first).
6
дададзена
@JonesV, ды я сказаў «не будзе». Гэта Android IDE ад Google на гэта, відавочна, будзе мець. Прачытайце гэтую .
дададзена аўтар ArtemStorozhuk, крыніца
@JonesV дзякуй за што :) Я думаю, што Android-студыя не будзе такіх праблем.
дададзена аўтар ArtemStorozhuk, крыніца
Нават прывітанне-JNI не працуе?
дададзена аўтар ArtemStorozhuk, крыніца
Я бачу толькі адзін з магчымых рашэнняў: пераўсталёўка Eclipse. Я рэкамендую вам спампаваць яго непасрэдна з Android сайта .
дададзена аўтар ArtemStorozhuk, крыніца
Ці ёсць знайсці кампілятар jni.h ? Калі так, то ён ўтрымлівае NewStringUTF функцыі?
дададзена аўтар ArtemStorozhuk, крыніца
Вось яшчэ адзін цікавы момант: пры паўторнай ўстаноўцы Eclipse, і зноў імпартаваць мой праект, я прыйшоў з сапраўды такой жа праблемай ...
дададзена аўтар JonesV, крыніца
Дзякуй за вашу дапамогу. Паспрабую 1. заўтра. Для 2. , я ўжо абнавіў яго. Я ў цяперашні час выкарыстоўваю 3. , каб запусціць праект, але мне трэба рабіць гэта кожны раз, так як адны і тыя ж памылкі вяртаюцца. Я думаю, што я ўжо спрабаваў 4. , але я паспрабую яшчэ раз заўтра!
дададзена аўтар JonesV, крыніца
<�Код> 4. не працуе. Для 1 , у мяне ёсць памылка ў прывітанне-jni.c :. <�Код> Метад 'NewStringUTF' не можа быць дазволены . Любая новая ідэя?
дададзена аўтар JonesV, крыніца
Больш цікава, я ўсталяваў новую версію Eclipse, ADT імпартаваць мой праект, і гэта былі тыя ж самыя памылкі. Затым я спрабаваў імпартаваць прывітанне-JNI у гэтым новым Eclipse, і мае тую ж самую памылку. Ці магчыма, што мая праблема звязана з маёй Ubuntu? Усё працавала выдатна на працягу апошніх некалькіх месяцаў, хоць ...
дададзена аўтар JonesV, крыніца
Дакладна. Ёсць, такім чынам, нешта агульнае паміж маім старым Зацьменні і свеже усталяванай той, які можа быць зменены?
дададзена аўтар JonesV, крыніца
Я даў табе шчадроты, каб падзякаваць Вам за той час вы патрацілі на маёй праблеме. Але больш каментарыяў было б вельмі ўдзячны =).
дададзена аўтар JonesV, крыніца
Я не маю на самай справе, бо няма ніякай інтэграцыі NDK пакуль ... =)
дададзена аўтар JonesV, крыніца
Праект кампілюецца паспяхова. Калі я Ctrl + клік на jni.h у ўключае ў сябе, я іду ў файл і змяшчае NewStringUTF функцыі.
дададзена аўтар JonesV, крыніца

I had the same issue. I had all the proper include paths setup but after opening the .c/.cpp or .h file and it would start marking everything as "Unresolved."
This worked for me...
Go to:
PREFERENCES -> C/C++ -> INDEXER
Check Index Source And Header Files Open in Editor.

0
дададзена

У мяне была такая ж праблема, як і многія людзі.

Я рушыў услед за крокамі ў Ayberk Özgür пасады, якія робяць добрае пачуццё. Хоць я таксама павінен быў пераканацца, што ставіць ўключае ў сябе пры ўсіх трох мовах: GNU C, GNU C ++, і зборка. Магчыма таму, што я не выкарыстоўваю ў адзіночку падстаўкі ланцуга інструмента.

Я спачатку быў мой ўключае ў сябе толькі пад GNU C і мовах GNU C ++. Які пакінуў мяне яшчэ з нявырашанымі ўключае памылку. Ня, пакуль не прызначана мой ўключае ў сябе пад мовай асэмблера, а таксама зрабілі мае памылкі сыходзяць.

Я не ведаю, чаму зацямненне толькі пошук праз Асэмблер ўключае ў маім праекце. Я таксама не ведаю, як гэтая частка рашэння будзе працаваць для вялікіх больш складаных праектаў.

Спадзяюся, што гэта дапамагае.

0
дададзена

Go to Preferences > C/C++ > Language Mapping > ADD (Source C File and select GNU C) Do the same for C++

0
дададзена
Гэта не вырашыць праблему, на жаль ...
дададзена аўтар JonesV, крыніца

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.

0
дададзена

Я толькі што правёў каля 3 гадзін стукаў галавой аб гэтай праблеме індэксацыі Зацьменні NDK! ..

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)

0
дададзена