您的位置:首页 > 大数据 > 人工智能

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

2017-05-11 16:37 666 查看
引起该错误有多种原因,有一种是因为在生成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)

简单分析



仔细看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)



与Java进行交互的cpp文件二(JniUtil.cpp)



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

我这里选择删掉native-lib.cpp文件里面的定义,但是这个文件里面有用这个函数,又不能重复定义,好像除了改一下函数名字没有其他办法了,其实不然,只需要在这里声明一下这个函数就行了,不用定义。就像下面这样。可以看到函数左边有红绿两个箭头,说明该函数有定义或者依赖。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jni android
相关文章推荐