JNI的编译中引入第三方库的步骤和一些问题undefined reference to `stderr‘

1.CMakeLists.txt 文件的编写

  1. 当你需要指定头文件事,需要将头文件的包路径也指定

    include_directories(你的包名)
  2. 举个例子

我的需要加入

include_directories(idr)

2.代码源文件引入:

add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] [source1] [source2 ...])

 将我们需要用到的源文件指定;

第一个是生成的库名称,第二个表示库的类型(STATIC和SHARED)。

后面的参数是你需要导入的源文件;(头文件不需要)。

3.引入第三方库

 上面是引入第三方库的方式;与1.2相同,唯一的一个是需要set_target_properties

set_target_properties(target1 target2 ... 
PROPERTIES prop1 value1 
prop2 value2 ...)

 引入第三方库后,需要最后一步——关联所有库:

注意:这一步的库使用顺序一定要按照要求来!顺序不能随便写;

3.关于编译的一些错误

3.1 

    1. fatal error: asm/types.h: No such file or directory

 详细报错如下:

3.	Build command failed.
4.	  Error while executing process C:\\androidSDK\Sdk\cmake\3.10.2.4988404\bin\ninja.exe with arguments {-C C:\\androidProject\qrcode\QrCodeScan\rk3568qrcode\.cxx\Debug\1q3v3a1v\arm64-v8a rk3568Qrcode}
5.	  ninja: Entering directory `C:\\androidProject\qrcode\QrCodeScan\rk3568qrcode\.cxx\Debug\1q3v3a1v\arm64-v8a'
6.	  [1/3] Building C object CMakeFiles/rk3568Qrcode.dir/rk3568_qrcode.c.o
7.	  FAILED: CMakeFiles/rk3568Qrcode.dir/rk3568_qrcode.c.o 
8.	  C:\\androidSDK\Sdk\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-gcc.exe --sysroot=C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot -Drk3568Qrcode_EXPORTS -IC://androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/inc -IC://androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/idr -std=c99 -Wl,--allow-shlib-undefined -Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -fPIC              -O0  -fPIC -MD -MT CMakeFiles/rk3568Qrcode.dir/rk3568_qrcode.c.o -MF CMakeFiles\rk3568Qrcode.dir\rk3568_qrcode.c.o.d -o CMakeFiles/rk3568Qrcode.dir/rk3568_qrcode.c.o   -c C://androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/rk3568_qrcode.c
9.	  In file included from C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot/usr/include/sys/types.h:36:0,
10.	                   from C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot/usr/include/bits/timespec.h:33,
11.	                   from C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot/usr/include/sched.h:32,
12.	                   from C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/rk3568_qrcode.c:14:
13.	  C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot/usr/include/linux/types.h:21:23: fatal error: asm/types.h: No such file or directory
14.	   #include <asm/types.h>
15.	                         ^
16.	  compilation terminated.
17.	  [2/3] Building C object CMakeFiles/rk3568Qrcode.dir/idr_test_lib.c.o
18.	  FAILED: CMakeFiles/rk3568Qrcode.dir/idr_test_lib.c.o 
19.	  C:\111\androidSDK\Sdk\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-gcc.exe --sysroot=C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot -Drk3568Qrcode_EXPORTS -IC:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/inc -IC:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/idr -std=c99 -Wl,--allow-shlib-undefined -Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -fPIC              -O0  -fPIC -MD -MT CMakeFiles/rk3568Qrcode.dir/idr_test_lib.c.o -MF CMakeFiles\rk3568Qrcode.dir\idr_test_lib.c.o.d -o CMakeFiles/rk3568Qrcode.dir/idr_test_lib.c.o   -c C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/idr_test_lib.c
20.	  In file included from C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot/usr/include/sys/types.h:36:0,
21.	                   from C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot/usr/include/sys/time.h:33,
22.	                   from C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/idr_test_lib.c:13:
23.	  C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot/usr/include/linux/types.h:21:23: fatal error: asm/types.h: No such file or directory
24.	   #include <asm/types.h>
25.	                         ^
26.	  compilation terminated.
27.	  ninja: build stopped: subcommand failed.

该错误是找不到系统的一些头文件,改动方式是在CmakeLists中加入

if (${ANDROID_ABI} STREQUAL "armeabi-v7a") include_directories(${ANDROID_SYSROOT}/usr/include/arm-linux-androideabi) elseif (${ANDROID_ABI} STREQUAL "arm64-v8a") include_directories(${ANDROID_SYSROOT}/usr/include/aarch64-linux-android) else () include_directories(${ANDROID_SYSROOT}/usr/include/arm-linux-androideabi) endif ()

 3.2 undefined reference to `stderr'

该报错的完整错误提示如下

 [3/3] Linking C shared library C:\111\androidProject\qrcode\QrCodeScan\rk3568qrcode\build\intermediates\cxx\Debug\1q3v3a1v\obj\arm64-v8a\librk3568Qrcode.so
FAILED: C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/build/intermediates/cxx/Debug/1q3v3a1v/obj/arm64-v8a/librk3568Qrcode.so 
cmd.exe /C "cd . && C:\111\androidSDK\Sdk\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-gcc.exe --sysroot=C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot -fPIC -std=c99 -Wl,--allow-shlib-undefined -Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -fPIC              -O0  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a --sysroot C:/111/androidSDK/Sdk/android-ndk-r16b/platforms/android-21/arch-arm64 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,librk3568Qrcode.so -o C:\111\androidProject\qrcode\QrCodeScan\rk3568qrcode\build\intermediates\cxx\Debug\1q3v3a1v\obj\arm64-v8a\librk3568Qrcode.so CMakeFiles/rk3568Qrcode.dir/rk3568_qrcode.c.o CMakeFiles/rk3568Qrcode.dir/idr_test_lib.c.o  C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_det_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_rsz_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_atc_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_loc_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_rec_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libamai_runtime_r1.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libmpimmz.so C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libc++_static.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libc++abi.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libandroid_support.a -lm -ldl -llog -latomic -lm && cd ."
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(xf86drm.c.o): In function `drmMsg':
(.text.drmMsg+0x9c): undefined reference to `stderr'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(xf86drm.c.o): In function `drmMsg':
(.text.drmMsg+0xa0): undefined reference to `stderr'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(xf86drm.c.o): In function `drmWaitVBlank':
(.text.drmWaitVBlank+0x108): undefined reference to `stderr'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(xf86drm.c.o): In function `drmWaitVBlank':
(.text.drmWaitVBlank+0x10c): undefined reference to `stderr'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(xf86drm.c.o): In function `drmError':
(.text.drmError+0x34): undefined reference to `stderr'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(xf86drm.c.o):(.text.drmError+0x38): more undefined references to `stderr' follow
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(cnpy.cpp.o): In function `load_the_npz_array(__sFILE*, unsigned int, unsigned int)':
(.text._Z18load_the_npz_arrayP7__sFILEjj+0xd8): undefined reference to `inflateInit2_'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(cnpy.cpp.o): In function `load_the_npz_array(__sFILE*, unsigned int, unsigned int)':
(.text._Z18load_the_npz_arrayP7__sFILEjj+0xf4): undefined reference to `inflate'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(cnpy.cpp.o): In function `load_the_npz_array(__sFILE*, unsigned int, unsigned int)':
(.text._Z18load_the_npz_arrayP7__sFILEjj+0xfc): undefined reference to `inflateEnd'
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

主要的报错是 undefined reference to `stderr'

标准错误;

这个错误主要是跟你的编译环境有关系,需要你明确知道自己应该是Android最低多少版本中编译。

 查看你编译使用的NDK版本中的Android最低支持的版本; 然后在项目的build.gradle文件中添加:

arguments '-DANDROID_PLATFORM=android-24'

其中Android版本是你使用环境支持的版本,看你需要用哪个。

添加的地方:

 

2.3 undefined reference to `inflateInit2_'

 Build command failed.
Error while executing process C:\111\androidSDK\Sdk\cmake\3.10.2.4988404\bin\ninja.exe with arguments {-C C:\111\androidProject\qrcode\QrCodeScan\rk3568qrcode\.cxx\Debug\1p06p3h3\arm64-v8a rk3568Qrcode}
ninja: Entering directory `C:\111\androidProject\qrcode\QrCodeScan\rk3568qrcode\.cxx\Debug\1p06p3h3\arm64-v8a'
[1/1] Linking C shared library C:\111\androidProject\qrcode\QrCodeScan\rk3568qrcode\build\intermediates\cxx\Debug\1p06p3h3\obj\arm64-v8a\librk3568Qrcode.so
FAILED: C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/build/intermediates/cxx/Debug/1p06p3h3/obj/arm64-v8a/librk3568Qrcode.so 
cmd.exe /C "cd . && C:\111\androidSDK\Sdk\android-ndk-r16b\toolchains\aarch64-linux-android-4.9\prebuilt\windows-x86_64\bin\aarch64-linux-android-gcc.exe --sysroot=C:/111/androidSDK/Sdk/android-ndk-r16b/sysroot -fPIC -std=c99 -Wl,--allow-shlib-undefined -Wall -Wno-unused-function -Wno-unused-variable -Wno-unused-but-set-variable -fPIC              -O0  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a --sysroot C:/111/androidSDK/Sdk/android-ndk-r16b/platforms/android-24/arch-arm64 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,librk3568Qrcode.so -o C:\111\androidProject\qrcode\QrCodeScan\rk3568qrcode\build\intermediates\cxx\Debug\1p06p3h3\obj\arm64-v8a\librk3568Qrcode.so CMakeFiles/rk3568Qrcode.dir/rk3568_qrcode.c.o CMakeFiles/rk3568Qrcode.dir/idr_test_lib.c.o  C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_det_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_rsz_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_atc_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_loc_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libidr_rec_rn.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libamai_runtime_r1.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libmpimmz.so C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libc++_static.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libc++abi.a C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/libandroid_support.a -lm -ldl -llog -latomic -lm && cd ."
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(cnpy.cpp.o): In function `load_the_npz_array(__sFILE*, unsigned int, unsigned int)':
(.text._Z18load_the_npz_arrayP7__sFILEjj+0xd8): undefined reference to `inflateInit2_'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(cnpy.cpp.o): In function `load_the_npz_array(__sFILE*, unsigned int, unsigned int)':
(.text._Z18load_the_npz_arrayP7__sFILEjj+0xf4): undefined reference to `inflate'
C:/111/androidProject/qrcode/QrCodeScan/rk3568qrcode/src/main/cpp/extra/arm64-v8a/librnnnrt.a(cnpy.cpp.o): In function `load_the_npz_array(__sFILE*, unsigned int, unsigned int)':
(.text._Z18load_the_npz_arrayP7__sFILEjj+0xfc): undefined reference to `inflateEnd'
collect2.exe: error: ld returned 1 exit status

解决方案如下:

在CmakeLists.txt 中 添加

link_libraries(z)

添加的位置在

 

之前就行;

解决完这些,本次就编译通过了!

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值