解决JNI调试报错:No symbol directories found

本文详细记录了一次从AS2.3到AS3.0迁移过程中遇到的无法调试问题及解决方案。通过调整build.gradle配置、设置正确的debug配置和修改iml文件中的variant值,最终成功实现项目调试。
部署运行你感兴趣的模型镜像

项目从AS 2.3迁移到AS 3.0编译后,发现无法进行调试。在控制台中输出下面信息:

Attention! No symbol directories found - please check your native debug configuration

在网上搜了一下资料,有人提出了下面的解决方案:

  1. 打开app/build.gradle文件
  2. dependencies标签中加入下面的设置:
releaseCompile project(path: ':youModuleName', configuration: 'release')
debugCompile project(path: ':youModuleName', configuration: 'debug')
  1. 然后打开你的module/build.gradle文件
  2. android标识中加入publishNonDefault true

试验了一下,提示报错:

Unable to resolve dependency for ‘:app@debug/compileClasspath’: Could not resolve project :xxxxx.

貌似是说找不到项目以来的debug配置,继续查找资料,有人说依赖和被依赖的module/build.gradle中需要设置buildTypes并且里面必须包含你所设置的配置项,如:

buildTypes{
      debug{ ... }
      release{ ... }
}

但是我的项目中已经配置该项信息了,最后,经过不懈努力,找到了适合自己的方法:

  1. 首先app/build.gradle文件的dependencies标签中要配置debugCompile project(':youModuleName')

注:这里不设置configuration参数

  1. 然后module/build.gradle文件的android标签中加入publishNonDefault true
  2. 打开moudle的iml文件,找到<facet type="native-android-gradle" name="Native-Android-Gradle">,看一下它的子节点:
<configuration>
        <option name="SELECTED_BUILD_VARIANT" value="debug" />
</configuration>

如果SELECTED_BUILD_VARIANTvalue值不是debug,要改成debug
4. 然后对项目进行debug,OK!能够断点了!

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

BUG -- Linker flags (Release): -Wl,--gc-sections -Wl,--as-needed -Wl,--no-undefined -- Linker flags (Debug): -Wl,--gc-sections -Wl,--as-needed -Wl,--no-undefined -- ccache: NO -- Precompiled headers: NO -- Extra dependencies: dl m pthread rt -- 3rdparty dependencies: -- -- OpenCV modules: -- To be built: calib3d core dnn features2d flann gapi highgui imgcodecs imgproc ml objdetect photo stitching ts video videoio -- Disabled: world -- Disabled by dependency: - -- Unavailable: java python2 python3 -- Applications: tests perf_tests apps -- Documentation: NO -- Non-free algorithms: NO -- -- GUI: GTK3 -- GTK+: YES (ver 3.24.20) -- GThread : YES (ver 2.64.6) -- GtkGlExt: NO -- VTK support: NO -- -- Media I/O: -- ZLib: /usr/lib/x86_64-linux-gnu/libz.so (ver 1.2.11) -- JPEG: /usr/lib/x86_64-linux-gnu/libjpeg.so (ver 80) -- WEBP: build (ver encoder: 0x020f) -- PNG: /usr/lib/x86_64-linux-gnu/libpng.so (ver 1.6.37) -- TIFF: /usr/lib/x86_64-linux-gnu/libtiff.so (ver / ) -- JPEG 2000: OpenJPEG (ver 2.4.0) -- OpenEXR: /usr/lib/x86_64-linux-gnu/libImath.so /usr/lib/x86_64-linux-gnu/libIlmImf.so /usr/lib/x86_64-linux-gnu/libIex.so /usr/lib/x86_64-linux-gnu/libHalf.so /usr/lib/x86_64-linux-gnu/libIlmThread.so (ver 2_3) -- HDR: YES -- SUNRASTER: YES -- PXM: YES -- PFM: YES -- -- Video I/O: -- DC1394: YES (2.2.5) -- FFMPEG: YES -- avcodec: YES (58.54.100) -- avformat: YES (58.29.100) -- avutil: YES (56.31.100) -- swscale: YES (5.5.100) -- avresample: NO -- GStreamer: YES (1.16.3) -- v4l/v4l2: YES (linux/videodev2.h) -- -- Parallel framework: pthreads -- -- Trace: YES (with Intel ITT) -- -- Other third-party libraries: -- VA: NO -- Lapack: NO -- Eigen: YES (ver 3.3.7) -- Custom HAL: NO -- Protobuf: build (3.19.1) -- -- OpenCL: YES (no extra features) -- Include path: /home/hyzk/Downloads/opencv-4.7.0/3rdparty/include/opencl/1.2 -- Link libraries: Dynamic load -- -- Python (for build): /usr/bin/python3 -- -- Java: -- ant: NO -- JNI: NO -- Java wrappers: NO -- Java tests: NO -- -- Install to: /usr/local
07-20
C/C++: ld: error: found local symbol '_end' in global part of symbol table in file ../../../../src/main/jniLibs/arm64-v8a/libsunchip_rknn.so cmake_minimum_required(VERSION 3.4.1) project(RKFace VERSION 1.0.0) # 定义共享库 sunchip_rknn add_library(sunchip_rknn SHARED src/rknn_sunchip.c ) # 设置 C++ 标准 set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 基本编译选项 set(CMAKE_C_FLAGS "-Wall -fPIC -O2") set(CMAKE_CXX_FLAGS "-Wall -fPIC -O2") # Android 平台配置 if(CMAKE_SYSTEM_NAME STREQUAL "Android") add_definitions(-DANDROID) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") endif() # 包含目录 include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/include /src/rknn_sunchip.h ) # 源文件 set(main_source src/cmain.cc) # 库文件路径 set(LIBPATH ${CMAKE_CURRENT_SOURCE_DIR}/libs/android) # 链接库 set(LINKS ${LIBPATH}/libRKFace.so ${LIBPATH}/libnva.so ${LIBPATH}/librknnrt.so ) # Android 特定库 if(CMAKE_SYSTEM_NAME STREQUAL "Android") list(APPEND LINKS log c++_shared) endif() # 标准库 list(APPEND LINKS c m dl) # 生成可执行文件 add_executable(rkface.demo ${main_source}) # 链接库 target_link_libraries(rkface.demo ${LINKS}) # 设置安装目录为当前目录下的 install set(CMAKE_INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/install) # 安装可执行文件到 install/bin install(TARGETS rkface.demo RUNTIME DESTINATION bin) # 安装库文件到 install/lib install(FILES ${LIBPATH}/libRKFace.so ${LIBPATH}/libnva.so ${LIBPATH}/librknnrt.so DESTINATION lib ) # 安装头文件到 install/include (如果需要) install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/include/ DESTINATION include FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp" ) # 安装共享库 install(TARGETS sunchip_rknn RUNTIME DESTINATION lib) 我通过这个脚本打包的库为什么会报错
06-14
Execution failed for task ':app:buildCMakeDebug[x86_64]'. > com.android.ide.common.process.ProcessException: ninja: Entering directory `U:\code\Android\AutoMate\app\.cxx\Debug\4b6u6p29\x86_64' [1/3] Linking CXX shared library U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libstringUtils.so FAILED: U:/code/Android/AutoMate/app/build/intermediates/cxx/Debug/4b6u6p29/obj/x86_64/libstringUtils.so cmd.exe /C "cd . && U:\Tools\Android\SDK\ndk\27.0.12077973\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=x86_64-none-linux-android24 --sysroot=U:/Tools/Android/SDK/ndk/27.0.12077973/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libstringUtils.so -o U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libstringUtils.so CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o -latomic -lm && cd ." ld.lld: error: undefined symbol: MD5_Init >>> referenced by stringUtils.cpp:19 (U:/code/Android/AutoMate/app/src/main/cpp/utils/stringUtils.cpp:19) >>> CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o:(StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&)) * Try: > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org. * Exception is: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:buildCMakeDebug[x86_64]'. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:130) at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:293) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:128) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116) at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74) at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314) at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) Caused by: org.gradle.internal.UncheckedException: com.android.ide.common.process.ProcessException: ninja: Entering directory `U:\code\Android\AutoMate\app\.cxx\Debug\4b6u6p29\x86_64' [1/3] Linking CXX shared library U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libstringUtils.so FAILED: U:/code/Android/AutoMate/app/build/intermediates/cxx/Debug/4b6u6p29/obj/x86_64/libstringUtils.so cmd.exe /C "cd . && U:\Tools\Android\SDK\ndk\27.0.12077973\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=x86_64-none-linux-android24 --sysroot=U:/Tools/Android/SDK/ndk/27.0.12077973/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libstringUtils.so -o U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libstringUtils.so CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o -latomic -lm && cd ." ld.lld: error: undefined symbol: MD5_Init >>> referenced by stringUtils.cpp:19 (U:/code/Android/AutoMate/app/src/main/cpp/utils/stringUtils.cpp:19) >>> CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o:(StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&)) ld.lld: error: undefined symbol: MD5_Update >>> referenced by stringUtils.cpp:20 (U:/code/Android/AutoMate/app/src/main/cpp/utils/stringUtils.cpp:20) >>> CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o:(StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&)) ld.lld: error: undefined symbol: MD5_Final >>> referenced by stringUtils.cpp:21 (U:/code/Android/AutoMate/app/src/main/cpp/utils/stringUtils.cpp:21) >>> CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o:(StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&)) clang++: error: linker command failed with exit code 1 (use -v to see invocation) [2/3] Linking CXX shared library U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libproject.so FAILED: U:/code/Android/AutoMate/app/build/intermediates/cxx/Debug/4b6u6p29/obj/x86_64/libproject.so cmd.exe /C "cd . && U:\Tools\Android\SDK\ndk\27.0.12077973\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=x86_64-none-linux-android24 --sysroot=U:/Tools/Android/SDK/ndk/27.0.12077973/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libproject.so -o U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libproject.so CMakeFiles/project.dir/project/project.cpp.o -latomic -lm && cd ." ld.lld: error: undefined symbol: StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&) >>> referenced by project.cpp:37 (U:/code/Android/AutoMate/app/src/main/cpp/project/project.cpp:37) >>> CMakeFiles/project.dir/project/project.cpp.o:(Project::getName(_JNIEnv*, _jobject*)) clang++: error: linker command failed with exit code 1 (use -v to see invocation) ninja: build stopped: subcommand failed. C++ build system [build] failed while executing: @echo off "U:\\Tools\\Android\\SDK\\cmake\\3.22.1\\bin\\ninja.exe" ^ -C ^ "U:\\code\\Android\\AutoMate\\app\\.cxx\\Debug\\4b6u6p29\\x86_64" ^ automate ^ fileShard ^ fileUtils ^ javaUtils ^ project ^ stringUtils from U:\code\Android\AutoMate\app at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:69) at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:42) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:128) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29) at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:244) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47) at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:229) at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:212) at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:195) at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:162) at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105) at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44) at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59) at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56) at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44) at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:42) at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:75) at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55) at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50) at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28) at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:67) at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:37) at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61) at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26) at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:69) at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:46) at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:40) at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:29) at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189) at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75) at org.gradle.internal.Either$Right.fold(Either.java:175) at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62) at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73) at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48) at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46) at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35) at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:75) at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:53) at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:53) at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:35) at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37) at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27) at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49) at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27) at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71) at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39) at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:65) at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:36) at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:105) at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:54) at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:64) at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:43) at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:125) at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:56) at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:36) at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38) at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36) at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23) at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75) at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41) at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35) at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:289) at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31) at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22) at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40) at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23) at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67) at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67) at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39) at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46) at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34) at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:48) at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:35) at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:61) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:127) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116) at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74) at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:209) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:166) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314) at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:85) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:459) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:376) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) Caused by: com.android.ide.common.process.ProcessException: ninja: Entering directory `U:\code\Android\AutoMate\app\.cxx\Debug\4b6u6p29\x86_64' [1/3] Linking CXX shared library U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libstringUtils.so FAILED: U:/code/Android/AutoMate/app/build/intermediates/cxx/Debug/4b6u6p29/obj/x86_64/libstringUtils.so cmd.exe /C "cd . && U:\Tools\Android\SDK\ndk\27.0.12077973\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=x86_64-none-linux-android24 --sysroot=U:/Tools/Android/SDK/ndk/27.0.12077973/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libstringUtils.so -o U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libstringUtils.so CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o -latomic -lm && cd ." ld.lld: error: undefined symbol: MD5_Init >>> referenced by stringUtils.cpp:19 (U:/code/Android/AutoMate/app/src/main/cpp/utils/stringUtils.cpp:19) >>> CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o:(StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&)) ld.lld: error: undefined symbol: MD5_Update >>> referenced by stringUtils.cpp:20 (U:/code/Android/AutoMate/app/src/main/cpp/utils/stringUtils.cpp:20) >>> CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o:(StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&)) ld.lld: error: undefined symbol: MD5_Final >>> referenced by stringUtils.cpp:21 (U:/code/Android/AutoMate/app/src/main/cpp/utils/stringUtils.cpp:21) >>> CMakeFiles/stringUtils.dir/utils/stringUtils.cpp.o:(StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&)) clang++: error: linker command failed with exit code 1 (use -v to see invocation) [2/3] Linking CXX shared library U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libproject.so FAILED: U:/code/Android/AutoMate/app/build/intermediates/cxx/Debug/4b6u6p29/obj/x86_64/libproject.so cmd.exe /C "cd . && U:\Tools\Android\SDK\ndk\27.0.12077973\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=x86_64-none-linux-android24 --sysroot=U:/Tools/Android/SDK/ndk/27.0.12077973/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -fno-limit-debug-info -static-libstdc++ -Wl,--build-id=sha1 -Wl,--no-rosegment -Wl,--no-undefined-version -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libproject.so -o U:\code\Android\AutoMate\app\build\intermediates\cxx\Debug\4b6u6p29\obj\x86_64\libproject.so CMakeFiles/project.dir/project/project.cpp.o -latomic -lm && cd ." ld.lld: error: undefined symbol: StringUtils::getStringMd5(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char>> const&) >>> referenced by project.cpp:37 (U:/code/Android/AutoMate/app/src/main/cpp/project/project.cpp:37) >>> CMakeFiles/project.dir/project/project.cpp.o:(Project::getName(_JNIEnv*, _jobject*)) clang++: error: linker command failed with exit code 1 (use -v to see invocation) ninja: build stopped: subcommand failed. C++ build system [build] failed while executing: @echo off "U:\\Tools\\Android\\SDK\\cmake\\3.22.1\\bin\\ninja.exe" ^ -C ^ "U:\\code\\Android\\AutoMate\\app\\.cxx\\Debug\\4b6u6p29\\x86_64" ^ automate ^ fileShard ^ fileUtils ^ javaUtils ^ project ^ stringUtils from U:\code\Android\AutoMate\app at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt.execute(ExecuteProcess.kt:288) at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt$executeProcess$1.invoke(ExecuteProcess.kt:108) at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt$executeProcess$1.invoke(ExecuteProcess.kt:106) at com.android.build.gradle.internal.cxx.timing.TimingEnvironmentKt.time(TimingEnvironment.kt:32) at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt.executeProcess(ExecuteProcess.kt:106) at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt.executeProcess$default(ExecuteProcess.kt:85) at com.android.build.gradle.internal.cxx.build.CxxRegularBuilder.executeProcessBatch(CxxRegularBuilder.kt:332) at com.android.build.gradle.internal.cxx.build.CxxRegularBuilder.build(CxxRegularBuilder.kt:129) at com.android.build.gradle.tasks.ExternalNativeBuildTask.doTaskAction(ExternalNativeBuildTask.kt:72) at com.android.build.gradle.internal.tasks.UnsafeOutputsTask$taskAction$$inlined$recordTaskAction$1.invoke(BaseTask.kt:78) at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:51) at com.android.build.gradle.internal.tasks.UnsafeOutputsTask.taskAction(UnsafeOutputsTask.kt:81) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125) ... 116 more Caused by: com.android.ide.common.process.ProcessException: Error while executing process U:\Tools\Android\SDK\cmake\3.22.1\bin\ninja.exe with arguments {-C U:\code\Android\AutoMate\app\.cxx\Debug\4b6u6p29\x86_64 automate fileShard fileUtils javaUtils project stringUtils} at com.android.build.gradle.internal.process.GradleProcessResult.buildProcessException(GradleProcessResult.java:73) at com.android.build.gradle.internal.process.GradleProcessResult.assertNormalExitValue(GradleProcessResult.java:48) at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt.execute(ExecuteProcess.kt:277) ... 129 more Caused by: org.gradle.process.internal.ExecException: Process 'command 'U:\Tools\Android\SDK\cmake\3.22.1\bin\ninja.exe'' finished with non-zero exit value 1 at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:442) at com.android.build.gradle.internal.process.GradleProcessResult.assertNormalExitValue(GradleProcessResult.java:46) ... 130 more BUILD FAILED in 1s 33 actionable tasks: 2 executed, 31 up-to-date
最新发布
11-28
<think>好的,用户遇到了Android JNI开发中的错误:“error: no template named 'function' in namespace 'std’”。我需要先分析这个错误的原因,然后给出解决方法。 首先,这个错误提示是说在std命名空间中没有找到名为function的模板。std::function是C++标准库中的一个模板类,位于<functional>头文件中。通常,这个错误是因为没有包含必要的头文件,或者编译器不支持C++11及更高版本。 接下来,我需要考虑用户可能的开发环境。Android JNI开发通常使用NDK,而NDK的版本和配置可能会影响C++标准的支持。用户可能在编译时没有正确设置C++标准,或者没有包含<functional>头文件。 可能的解决步骤包括: 1. 确保在C++源文件中包含了#include <functional>。 2. 检查NDK的build.gradle配置,确认使用的C++标准版本是否正确,比如C++11或更高。 3. 如果用户使用的是较旧的NDK版本,可能需要升级NDK或者调整编译参数。 4. 确保没有在代码中错误地使用using namespace std;导致命名冲突,但这种情况可能性较低。 另外,需要提醒用户在修改配置后执行清理构建,因为缓存可能导致问题依旧存在。同时,可能需要检查其他依赖或代码中是否有拼写错误,比如是否误写为std::function而实际需要其他类型。 需要将这些步骤用清晰的中文解释,结构分明,帮助用户逐步排查问题。同时,注意使用正确的LaTeX格式,但根据用户的问题内容,可能不需要太多数学公式,但需要确保行内代码用$...$包裹,如#include <functional>。</think>### Android JNI开发报错 `error: no template named 'function' in namespace 'std'` 解析 #### 问题原因 此错误通常由以下两种原因导致: 1. **缺少头文件包含**:`std::function` 属于C++标准库的`<functional>`头文件,未包含该头文件时编译器无法识别。 2. **C++标准版本不匹配**:若未启用C++11或更高版本,编译器可能不支持`std::function`。 --- #### 解决方案步骤 ##### 1. 添加头文件包含 在**使用`std::function`的C++文件顶部**添加: ```cpp #include <functional> // 必须添加此行 ``` ##### 2. 配置NDK编译参数 在项目的 `build.gradle` 文件中,检查或添加以下配置: ```groovy android { defaultConfig { externalNativeBuild { cmake { // 显式指定C++标准版本(至少C++11) cppFlags "-std=c++11" // 或更高版本(推荐C++17) // cppFlags "-std=c++17" } } } } ``` ##### 3. 检查CMakeLists.txt配置 如果使用CMake,在 `CMakeLists.txt` 中添加标准要求: ```cmake set(CMAKE_CXX_STANDARD 11) # 或 14/17/20 set(CMAKE_CXX_STANDARD_REQUIRED ON) ``` ##### 4. 验证NDK版本 * 确保NDK版本≥ **r18**(旧版本可能对C++11支持不完整) * 在 `local.properties` 中指定较新NDK版本: ```properties ndk.version=25.1.8937393 # 示例版本 ``` ##### 5. 清理构建缓存 修改配置后执行清理操作: - Android Studio: `Build > Clean Project` + `Build > Rebuild Project` - 命令行: `./gradlew clean` --- #### 附加排查 若问题仍未解决,检查以下可能性: 1. **命名空间污染**:确认代码中未通过`using namespace std;`意外覆盖符号 2. **拼写错误**:确认代码中未误写为 `std::Function`(注意大小写) 3. **交叉编译兼容性**:在 `Application.mk` 中添加: ```makefile APP_STL := c++_shared # 使用完整STL实现 ``` --- #### 示例代码修正 **错误代码**: ```cpp // 缺少头文件且未指定C++标准 std::function<void()> callback; // 触发编译错误 ``` **修正后代码**: ```cpp #include <functional> // 添加头文件 // 启用C++11后正常编译 std::function<void()> callback; ``` --- 通过以上步骤可解决`std::function`相关编译错误,若涉及更复杂的模板场景,建议同步检查代码逻辑与标准库的兼容性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值