新手问题,NDK编译C代码如何引用第三方库?

时间:2021-06-24 16:10:09
我的C代码中调用到了另外一个库的函数,在Linux的Makefile中可以很简单的通过-L和-l来引用这个库,但在Android平台上使用NDK如何添加这种引用关系?
我试着在Android.mk中添加
LOCAL_LDLIBS := -lmylib
并将libmylib.a放到jni目录下,可ndk-build的时候总是提示cannot find -lmylib,我试着用-L添加绝对路径,还是不行。

我刚开始用NDK,请问哪位同学能帮我解答一下这个问题,谢谢!

9 个解决方案

#1


放到NDK的库文件夹里面去

#2


把.a库文件放到 ANDROID_NDK_ROOT下的交叉编译工具的libs下,试试能不能连接到

#3


回楼上的两位,我试了一下,还是不行。
我用的版本是NDK r7,安装路径是
D:\Android\android-ndk-r7\
交叉编译工具的lib目录的路径就是
D:\Android\android-ndk-r7\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\lib
我用的第三方库既有动态库又有静态库,我分别把这两种库放到这个目录下,编译的时候还是提示找不到。

会不会是我理解的路径有问题,不是这个目录?

#4


  问题解决,我把用到的库放到系统的库文件目录下,编译通过。

  我原来对系统库文件目录的理解确实是不对的,库文件的目录应该是ANDROID_NDK_ROOT\platforms\android-3\arch-arm\usr\lib,而不是ANDROID_NDK_ROOT\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\lib,后者应该是交叉编译器的库文件目录。运行的时候程序依赖的库文件应该是在目标设备的/usr/lib目录下。
  但这个地方还有个问题,我安装的是NDK r7,platforms目录下除了android-3还有4、5、8、9、14,每个目录下都分为arch-arm和arch-x86,但为什么只有放在android-3\arch-arm的库文件目录下才可以,其他的都不可以?我在Android.mk和NDK的参数中都没有指定版本,默认就是使用最低版本吗?那么我应该如何指定我要支持的版本呢?比如我编译的库要用在Android 3.2上,Android API的级别应该是13,那在NDK的编译中我应该如何指定呢?
  在这方面我还是个新手,希望能有内行帮我解答一下。谢谢!

  另外这里有个NDK调用动态库的资料,虽然没有解答我的疑问,但还是挺有用的,贴出来与广大新手分享。
  http://www.cnblogs.com/zhangweia/archive/2010/09/16/1828176.html

#5


你用的第三方lib是用ndk编译的么?

#6


引用 5 楼 ultrapro 的回复:
你用的第三方lib是用ndk编译的么?


是的,我放到系统的库目录下试过,是可用的。

#7


结贴吧。。

#8


引用 6 楼 justyan 的回复:
引用 5 楼 ultrapro 的回复:

你用的第三方lib是用ndk编译的么?


是的,我放到系统的库目录下试过,是可用的。


请问你是在windows下,用cygwin通过ndk-build编译的吗?我的编译C++库会有各种错误,说是找不到fstream no such file or directory

#9


引用 6 楼 justyan 的回复:
引用 5 楼 ultrapro 的回复:

你用的第三方lib是用ndk编译的么?


是的,我放到系统的库目录下试过,是可用的。


麻烦帮我看看这个帖子吧
http://topic.csdn.net/u/20120217/14/477c355e-5117-4e3c-aa1e-2c24ab6fabc5.html

#1


放到NDK的库文件夹里面去

#2


把.a库文件放到 ANDROID_NDK_ROOT下的交叉编译工具的libs下,试试能不能连接到

#3


回楼上的两位,我试了一下,还是不行。
我用的版本是NDK r7,安装路径是
D:\Android\android-ndk-r7\
交叉编译工具的lib目录的路径就是
D:\Android\android-ndk-r7\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\lib
我用的第三方库既有动态库又有静态库,我分别把这两种库放到这个目录下,编译的时候还是提示找不到。

会不会是我理解的路径有问题,不是这个目录?

#4


  问题解决,我把用到的库放到系统的库文件目录下,编译通过。

  我原来对系统库文件目录的理解确实是不对的,库文件的目录应该是ANDROID_NDK_ROOT\platforms\android-3\arch-arm\usr\lib,而不是ANDROID_NDK_ROOT\toolchains\arm-linux-androideabi-4.4.3\prebuilt\windows\lib,后者应该是交叉编译器的库文件目录。运行的时候程序依赖的库文件应该是在目标设备的/usr/lib目录下。
  但这个地方还有个问题,我安装的是NDK r7,platforms目录下除了android-3还有4、5、8、9、14,每个目录下都分为arch-arm和arch-x86,但为什么只有放在android-3\arch-arm的库文件目录下才可以,其他的都不可以?我在Android.mk和NDK的参数中都没有指定版本,默认就是使用最低版本吗?那么我应该如何指定我要支持的版本呢?比如我编译的库要用在Android 3.2上,Android API的级别应该是13,那在NDK的编译中我应该如何指定呢?
  在这方面我还是个新手,希望能有内行帮我解答一下。谢谢!

  另外这里有个NDK调用动态库的资料,虽然没有解答我的疑问,但还是挺有用的,贴出来与广大新手分享。
  http://www.cnblogs.com/zhangweia/archive/2010/09/16/1828176.html

#5


你用的第三方lib是用ndk编译的么?

#6


引用 5 楼 ultrapro 的回复:
你用的第三方lib是用ndk编译的么?


是的,我放到系统的库目录下试过,是可用的。

#7


结贴吧。。

#8


引用 6 楼 justyan 的回复:
引用 5 楼 ultrapro 的回复:

你用的第三方lib是用ndk编译的么?


是的,我放到系统的库目录下试过,是可用的。


请问你是在windows下,用cygwin通过ndk-build编译的吗?我的编译C++库会有各种错误,说是找不到fstream no such file or directory

#9


引用 6 楼 justyan 的回复:
引用 5 楼 ultrapro 的回复:

你用的第三方lib是用ndk编译的么?


是的,我放到系统的库目录下试过,是可用的。


麻烦帮我看看这个帖子吧
http://topic.csdn.net/u/20120217/14/477c355e-5117-4e3c-aa1e-2c24ab6fabc5.html