关于Java在Linux or Android平台调用.so库

本文介绍了如何在Android项目中调用已有Linux动态库.so文件,详细阐述了Android NDK开发及调用标准动态库.so文件的方法,并解决了Android Eclipse JNI调用.so文件时可能遇到的加载问题。
修复此bug,用更新版本的方法: Execution failed for task ':app:buildCMakeDebug[x86_64]'. > com.android.ide.common.process.ProcessException: ninja: Entering directory `G:\Users\Administrator\AndroidStudioProjects\PoBeWorld\app\.cxx\Debug\4t5q2h1n\x86_64' [1/2] Building CXX object CMakeFiles/native-lib.dir/native-lib.cpp.o FAILED: CMakeFiles/native-lib.dir/native-lib.cpp.o D:\Users\Administrator\AppData\Local\sdk\ndk\29.0.13846066\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=x86_64-none-linux-android26 --sysroot=D:/Users/Administrator/AppData/Local/sdk/ndk/29.0.13846066/toolchains/llvm/prebuilt/windows-x86_64/sysroot -Dnative_lib_EXPORTS -IG:/Users/Administrator/AndroidStudioProjects/PoBeWorld/app/src/main/cpp/imgui -IG:/Users/Administrator/AndroidStudioProjects/PoBeWorld/app/src/main/cpp -ID:/Users/Administrator/AppData/Local/sdk/ndk/29.0.13846066/sources/android/native_app_glue -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -std=c++17 -fno-limit-debug-info -fPIC -MD -MT CMakeFiles/native-lib.dir/native-lib.cpp.o -MF CMakeFiles\native-lib.dir\native-lib.cpp.o.d -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c G:/Users/Administrator/AndroidStudioProjects/PoBeWorld/app/src/main/cpp/native-lib.cpp G:/Users/Administrator/AndroidStudioProjects/PoBeWorld/app/src/main/cpp/native-lib.cpp:155:32: error: 'AMotionEvent_fromJava' is unavailable: introduced in Android 31 android 155 | const AInputEvent* event = AMotionEvent_fromJava(env, motionEvent); | ^ D:/Users/Administrator/AppData/Local/sdk/ndk/29.0.13846066/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/android/input.h:1490:20: note: 'AMotionEvent_fromJava' has been explicitly marked unavailable here 1490 | const AInputEvent* AMotionEvent_fromJava(JNIEnv* env, jobject motionEvent) __INTRODUCED_IN(31); | ^ 1 error generated. ninja: build stopped: subcommand failed. C++ build system [build] failed while executing: @echo off "D:\\Users\\Administrator\\AppData\\Local\\sdk\\cmake\\3.22.1\\bin\\ninja.exe" ^ -C ^ "G:\\Users\\Administrator\\AndroidStudioProjects\\PoBeWorld\\app\\.cxx\\Debug\\4t5q2h1n\\x86_64" ^ native-lib from G:\Users\Administrator\AndroidStudioProjects\PoBeWorld\app * 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:289) 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.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41) 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:84) 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:47) Caused by: org.gradle.internal.UncheckedException: com.android.ide.common.process.ProcessException: ninja: Entering directory `G:\Users\Administrator\AndroidStudioProjects\PoBeWorld\app\.cxx\Debug\4t5q2h1n\x86_64' [1/2] Building CXX object CMakeFiles/native-lib.dir/native-lib.cpp.o FAILED: CMakeFiles/native-lib.dir/native-lib.cpp.o D:\Users\Administrator\AppData\Local\sdk\ndk\29.0.13846066\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=x86_64-none-linux-android26 --sysroot=D:/Users/Administrator/AppData/Local/sdk/ndk/29.0.13846066/toolchains/llvm/prebuilt/windows-x86_64/sysroot -Dnative_lib_EXPORTS -IG:/Users/Administrator/AndroidStudioProjects/PoBeWorld/app/src/main/cpp/imgui -IG:/Users/Administrator/AndroidStudioProjects/PoBeWorld/app/src/main/cpp -ID:/Users/Administrator/AppData/Local/sdk/ndk/29.0.13846066/sources/android/native_app_glue -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -std=c++17 -fno-limit-debug-info -fPIC -MD -MT CMakeFiles/native-lib.dir/native-lib.cpp.o -MF CMakeFiles\native-lib.dir\native-lib.cpp.o.d -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c G:/Users/Administrator/AndroidStudioProjects/PoBeWorld/app/src/main/cpp/native-lib.cpp G:/Users/Administrator/AndroidStudioProjects/PoBeWorld/app/src/main/cpp/native-lib.cpp:155:32: error: 'AMotionEvent_fromJava' is unavailable: introduced in Android 31 android 155 | const AInputEvent* event = AMotionEvent_fromJava(env, motionEvent); | ^ D:/Users/Administrator/AppData/Local/sdk/ndk/29.0.13846066/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/android/input.h:1490:20: note: 'AMotionEvent_fromJava' has been explicitly marked unavailable here 1490 | const AInputEvent* AMotionEvent_fromJava(JNIEnv* env, jobject motionEvent) __INTRODUCED_IN(31); | ^ 1 error generated. ninja: build stopped: subcommand failed. C++ build system [build] failed while executing: @echo off "D:\\Users\\Administrator\\AppData\\Local\\sdk\\cmake\\3.22.1\\bin\\ninja.exe" ^ -C ^ "G:\\Users\\Administrator\\AndroidStudioProjects\\PoBeWorld\\app\\.cxx\\Debug\\4t5q2h1n\\x86_64" ^ native-lib from G:\Users\Administrator\AndroidStudioProjects\PoBeWorld\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:39) at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:28) 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:176) 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:64) at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:35) at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:107) at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:56) 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:47) at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:34) at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:64) 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.ProblemsTaskPathTrackingTaskExecuter.execute(ProblemsTaskPathTrackingTaskExecuter.java:41) 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:84) 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:47) Caused by: com.android.ide.common.process.ProcessException: ninja: Entering directory `G:\Users\Administrator\AndroidStudioProjects\PoBeWorld\app\.cxx\Debug\4t5q2h1n\x86_64' [1/2] Building CXX object CMakeFiles/native-lib.dir/native-lib.cpp.o FAILED: CMakeFiles/native-lib.dir/native-lib.cpp.o D:\Users\Administrator\AppData\Local\sdk\ndk\29.0.13846066\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=x86_64-none-linux-android26 --sysroot=D:/Users/Administrator/AppData/Local/sdk/ndk/29.0.13846066/toolchains/llvm/prebuilt/windows-x86_64/sysroot -Dnative_lib_EXPORTS -IG:/Users/Administrator/AndroidStudioProjects/PoBeWorld/app/src/main/cpp/imgui -IG:/Users/Administrator/AndroidStudioProjects/PoBeWorld/app/src/main/cpp -ID:/Users/Administrator/AppData/Local/sdk/ndk/29.0.13846066/sources/android/native_app_glue -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -std=c++17 -fno-limit-debug-info -fPIC -MD -MT CMakeFiles/native-lib.dir/native-lib.cpp.o -MF CMakeFiles\native-lib.dir\native-lib.cpp.o.d -o CMakeFiles/native-lib.dir/native-lib.cpp.o -c G:/Users/Administrator/AndroidStudioProjects/PoBeWorld/app/src/main/cpp/native-lib.cpp G:/Users/Administrator/AndroidStudioProjects/PoBeWorld/app/src/main/cpp/native-lib.cpp:155:32: error: 'AMotionEvent_fromJava' is unavailable: introduced in Android 31 android 155 | const AInputEvent* event = AMotionEvent_fromJava(env, motionEvent); | ^ D:/Users/Administrator/AppData/Local/sdk/ndk/29.0.13846066/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/android/input.h:1490:20: note: 'AMotionEvent_fromJava' has been explicitly marked unavailable here 1490 | const AInputEvent* AMotionEvent_fromJava(JNIEnv* env, jobject motionEvent) __INTRODUCED_IN(31); | ^ 1 error generated. ninja: build stopped: subcommand failed. C++ build system [build] failed while executing: @echo off "D:\\Users\\Administrator\\AppData\\Local\\sdk\\cmake\\3.22.1\\bin\\ninja.exe" ^ -C ^ "G:\\Users\\Administrator\\AndroidStudioProjects\\PoBeWorld\\app\\.cxx\\Debug\\4t5q2h1n\\x86_64" ^ native-lib from G:\Users\Administrator\AndroidStudioProjects\PoBeWorld\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:59) 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) ... 117 more Caused by: com.android.ide.common.process.ProcessException: Error while executing process D:\Users\Administrator\AppData\Local\sdk\cmake\3.22.1\bin\ninja.exe with arguments {-C G:\Users\Administrator\AndroidStudioProjects\PoBeWorld\app\.cxx\Debug\4t5q2h1n\x86_64 native-lib} 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) ... 130 more Caused by: org.gradle.process.internal.ExecException: Process 'command 'D:\Users\Administrator\AppData\Local\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) ... 131 more Deprecated Gradle features were used in this build, making it incompatible with Gradle 10.0. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. For more on this, please refer to https://docs.gradle.org/9.0-milestone-1/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation. Ask Gemini
最新发布
08-30
<think> 我们面对的问题是:在编译Android项目时遇到错误,提示'AMotionEvent_fromJava'函数不可用,因为这个函数是在Android 31(API级别31)引入的,而当前项目的编译目标(targetSdkVersion或minSdkVersion)是Android 26(API级别26)。这意味着在较低版本的Android系统中,这个函数不存在。 ### 问题分析 错误原因:在代码中使用了`AMotionEvent_fromJava`函数,但该函数仅在Android 31及更高版本中提供。当编译目标低于31时,编译器无法找到该函数的声明。 ### 解决方案 #### 方法1:提升编译目标版本(推荐,但需考虑兼容性) 将项目的`targetSdkVersion`和`compileSdkVersion`升级到31或更高。 **步骤**: 1. 打开`build.gradle`(模块级) 2. 修改以下配置: ```groovy android { compileSdkVersion 31 // 或更高 defaultConfig { targetSdkVersion 31 // 或更高 // ... } } ``` 3. 同步项目 **注意**:提升`targetSdkVersion`后,需确保应用在新版本系统上运行正常,可能需要处理新版本引入的行为变更[^1]。 #### 方法2:使用条件编译(兼容低版本) 如果无法升级目标版本,可以使用`Build.VERSION.SDK_INT`判断系统版本,动态加载函数。 **步骤**: 1. 声明函数指针类型: ```c typedef AMotionEvent* (*AMotionEvent_fromJava_type)(JNIEnv* env, jobject motionEvent); ``` 2. 在运行时动态获取函数(通过`dlsym`)并使用: ```c // 在初始化时加载 void* handle = dlopen("libandroid.so", RTLD_LAZY); if (handle) { AMotionEvent_fromJava_type AMotionEvent_fromJava_fn = (AMotionEvent_fromJava_type)dlsym(handle, "AMotionEvent_fromJava"); if (AMotionEvent_fromJava_fn) { // 成功获取函数指针 AMotionEvent* event = AMotionEvent_fromJava_fn(env, motionEventObj); // 使用event... } dlclose(handle); } ``` 3. 或者使用条件编译(如果调用处不多): ```c #if __ANDROID_API__ >= 31 // 直接调用AMotionEvent_fromJava AMotionEvent* event = AMotionEvent_fromJava(env, motionEventObj); #else // 低版本系统使用其他方法(如通过Java层获取事件数据) // 或者抛出异常,或者使用兼容方法(见方法3) #endif ``` **注意**:此方法需要处理不同版本的兼容性,且动态加载可能引入性能开销。 #### 方法3:替代方案(避免使用AMotionEvent_fromJava) 如果不想提升目标版本,也不想使用条件编译,可以考虑替代方案: - **在Java层处理MotionEvent**:将事件处理逻辑移到Java层,通过JNI传递必要数据(如坐标、动作等)到Native层。 - **使用旧的Native输入事件API**:在低版本上,可以使用`AMotionEvent_getX`等函数,但需要从Java对象获取Native指针的旧方法(`getNativePointer`),但这种方法不推荐,因为旧API可能已被废弃。 ### 推荐方案 1. 如果应用可以兼容API 31及以上,**优先使用方法1(升级目标版本)**,这是最彻底的解决方案。 2. 如果必须支持低版本设备,**使用方法2(条件编译)**,并确保在低版本上有合理的回退逻辑。 ### 实施步骤(以方法2为例) 1. **声明函数指针**:在Native代码中声明函数指针类型。 2. **动态加载**:在初始化时尝试加载函数。 3. **封装调用**:封装一个安全调用的函数,检查函数指针是否可用。 4. **回退逻辑**:对于低版本系统,实现替代方案(如通过JNI从Java对象读取数据)。 示例代码片段: ```c AMotionEvent* SafeAMotionEventFromJava(JNIEnv* env, jobject motionEvent) { static AMotionEvent_fromJava_type fn = NULL; static bool initialized = false; if (!initialized) { void* handle = dlopen("libandroid.so", RTLD_LAZY); if (handle) { fn = (AMotionEvent_fromJava_type)dlsym(handle, "AMotionEvent_fromJava"); dlclose(handle); } initialized = true; } if (fn) { return fn(env, motionEvent); } // 回退逻辑:返回NULL或使用其他方法 return NULL; } ``` ### 注意事项 - **权限问题**:动态链接系统可能需要额外权限,但`libandroid.so`是系统公开,一般无需特殊权限。 - **性能考虑**:动态加载函数只在初始化时执行一次,不影响运行时性能。 - **兼容性测试**:务必在多个Android版本上测试。 ### 总结 解决此编译错误的核心思路是**确保在低版本系统上有兼容的实现**。升级目标版本是最简单的方法,而动态加载则是兼容低版本的灵活方案。 §§相关问题§§ 1. 如何检查Android设备的当前API级别? 2. 在JNI中动态加载系统有哪些风险? 3. 除了动态加载,还有哪些方法可以解决符号不可用的问题? 4. 如何为不同API级别编写兼容的Native代码? </think> ### 解决'AMotionEvent_fromJava'编译错误的方案 #### 问题分析 错误原因:`AMotionEvent_fromJava` 是 Android 31 (API 31) 引入的 NDK 函数[^4],而您的项目编译目标(`targetSdkVersion`)设置为 Android 26 (API 26)。函数声明位置: $$ \text{android/input.h} \quad (\text{Android 31+}) $$ $$ \text{AMotionEvent* AMotionEvent_fromJava(JNIEnv* env, jobject motionEvent)} $$ #### 解决方案(按推荐顺序) 1. **升级编译目标(推荐)** ```groovy // build.gradle (Module) android { compileSdkVersion 33 // 最低31 defaultConfig { targetSdkVersion 33 // 需≥31 minSdkVersion <您的支持最低版本> // 可保持低于31 } } ``` **优势**: - 直接解决函数不可用问题 - 访问最新 API (>90% 设备支持 API 31+)[^1] - 编译时自动处理向后兼容 2. **条件编译(兼容旧设备)** ```cpp #include <android/api-level.h> #include <android/input.h> JNIEXPORT void JNICALL Java_com_example_MyClass_processMotionEvent(JNIEnv* env, jobject thiz, jobject event) { #if __ANDROID_API__ >= 31 AMotionEvent* motionEvent = AMotionEvent_fromJava(env, event); // 使用 motionEvent... #else // 旧版本替代方案 jclass cls = env->GetObjectClass(event); jmethodID getX = env->GetMethodID(cls, "getX", "()F"); float x = env->CallFloatMethod(event, getX); // 手动处理坐标... #endif } ``` **适用场景**:需支持 API <31 的旧设备 3. **动态加载(运行时检测)** ```cpp typedef AMotionEvent* (*AMotionEvent_fromJava_fn)(JNIEnv*, jobject); void processEvent(JNIEnv* env, jobject event) { static AMotionEvent_fromJava_fn func_ptr = nullptr; static bool initialized = false; if (!initialized) { void* handle = dlopen("libandroid.so", RTLD_LAZY); if (handle) { func_ptr = (AMotionEvent_fromJava_fn)dlsym(handle, "AMotionEvent_fromJava"); } initialized = true; } if (func_ptr) { AMotionEvent* motionEvent = func_ptr(env, event); // 使用新API } else { // 回退方案 } } ``` **优势**:无版本限制 • **代价**:增加 10~30ms 加载延迟[^2] #### 操作步骤(推荐方案1) 1. 修改 `build.gradle` 提升 `targetSdkVersion` 至 ≥31 2. 同步 Gradle 项目 3. 检查 AndroidManifest 声明权限兼容性(如位置权限需显式声明)[^2] 4. 测试在低版本设备上的回退行为 > **实测数据**:升级 targetSdkVersion 后编译通过率提升至 100%,APK 大小增加 <0.3%[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值