JNI运行Error:error: linker command failed with exit code 1 (use -v to see invocation)解决

引起该错误有多种原因,有一种是因为在生成so文件的时候,无法生成支持所有CPU架构的so文件,这时候我们可以指定生成什么CPU架构的so,就市面而言,现在大多数Android机都是armeabi架构的,所以我们在gradle里面进行配置,
在gradle(app)->android->defaultConfig下面添加

ndk {
       abiFilters 'armeabi'//''armeabi-v7a','x86', 'x86_64', 'arm64-v8a','mips','mips_64',可根据自己实际需求进行筛选
 }

下面介绍另一种原因引起的该错误的解决办法:

gradle console信息

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ‘:app:externalNativeBuildDebug’.
Build command failed.
Error while executing process D:\AndroidAndJava\sdk\cmake\3.6.3155560\bin\cmake.exe with arguments {–build D:\WORKSPACE\AndroidStudio\CtsVideo\app.externalNativeBuild\cmake\debug\armeabi –target native-lib}
[1/2] Building CXX object CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o
[2/2] Linking CXX shared library ……..\build\intermediates\cmake\debug\obj\armeabi\libnative-lib.so
FAILED: cmd.exe ……..

“D:/AndroidAndJava/sdk/ndk-bundle/sources/cxx-stl/gnu-libstdc++/4.9/libs/armeabi/libgnustl_static.a” “-latomic” && cd .”
D:/AndroidAndJava/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin\ld: error: CMakeFiles/native-lib.dir/src/main/cpp/JniUtil.cpp.o: multiple definition of ‘charTojstring(_JNIEnv*, char const*)’

D:/AndroidAndJava/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin\ld: CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o: previous definition here

D:/AndroidAndJava/sdk/ndk-bundle/toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.9.x/../../../../arm-linux-androideabi/bin\ld: CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o: previous definition here
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.

* Try:
Run with –stacktrace option to get the stack trace. Run with –info or –debug option to get more log output.

Messages窗口错误信息

Error:error: linker command failed with exit code 1 (use -v to see invocation)

简单分析

JNI运行Error:error: linker command failed with exit code 1 (use -v to see invocation)解决_第1张图片
仔细看gradle console里面的错误信息,可以发现里面有这样的说明

multiple definition of ‘charTojstring(_JNIEnv*, char const*)’
previous definition here
multiple definition of ‘jstringTostring(_JNIEnv*, _jstring*)’
previous definition here

这里说明我们在cpp或者C文件里面重复定义了 charTojstring和jstringTostring函数,所以我们需要找到我们定义函数的地方,删掉其中一个定义,在使用的地方添加引用即可。

解决办法

找到我们定义函数的地方,删掉其中一个定义,在使用的地方添加引用即可。
找到冲突的地方,
与Java进行交互的Cpp文件一(native-lib.cpp)
JNI运行Error:error: linker command failed with exit code 1 (use -v to see invocation)解决_第2张图片

与Java进行交互的cpp文件二(JniUtil.cpp)
JNI运行Error:error: linker command failed with exit code 1 (use -v to see invocation)解决_第3张图片

可以看到这两个文件都定义了函数名相同的函数,及标注一为同一个函数,标注2为同一个函数

我这里选择删掉native-lib.cpp文件里面的定义,但是这个文件里面有用这个函数,又不能重复定义,好像除了改一下函数名字没有其他办法了,其实不然,只需要在这里声明一下这个函数就行了,不用定义。就像下面这样。可以看到函数左边有红绿两个箭头,说明该函数有定义或者依赖。
JNI运行Error:error: linker command failed with exit code 1 (use -v to see invocation)解决_第4张图片

你可能感兴趣的:(Android,jni)