android studio如何调用linux下交叉编译的so库

背景:android studio上需要使用别的同事用linux下(c++写)编译好的的so库,注意不是用c++源码放在android studio上编译;

实现原理:android studio实现JNI规范的接口,再用这套接口去调用linux下编好的so库,这个需要linux调用NDK中的交叉编译工具链进行交叉编译生成so库;

步骤:

1.NDK安装在linux环境上(ubuntu 14.04 64位系统)

通常下载r17(包括该版本)以下的版本,因为r18以上的版本gcc/g++已被改动成clang(我也不明白怎么用)。

在此我用的是别的网友提供的NDKhttps://dl.google.com/android/repository/android-ndk-r17-beta2-linux-x86_64.zip 下载到自建目录/opt/

#mkdir /opt/

#cd /opt/

#unzip android-ndk-r17-beta2-linux-x86_64.zip //解压

#vim /etc/profile

在最后加上

export NDK=/opt/android-ndk-r17-beta2
export PATH= P A T H : PATH: PATH:NDK

保存后退出,执行

#source /etc/profile
检查是否安装成功:
#ndk-build -v

img

2.写一个脚本build_so.sh,内容如下,把内容复制粘贴到build_so.sh即可。(脚本内容如下,我的测试代码是c++,所以用g++交叉编译工具链,如果是c代码,应该你也懂怎么改)

其中 -I /opt/android-ndk-r17-beta2/sources/cxx-stl/stlport/stlport/ 是为了解决cpp文件中含#include 等头文件不能生成库的问题;

#!/bin/bash

#export NDK_GCC=/opt/android-ndk-r17-beta2/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc
export NDK_GCC=/opt/android-ndk-r17-beta2/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-g++

export HO="–sysroot=/opt/android-ndk-r17-beta2/platforms/android-21/arch-arm -isystem /opt/android-ndk-r17-beta2/sysroot/usr/include -isystem /opt/android-ndk-r17-beta2/sysroot/usr/include/arm-linux-androideabi"

export NDK_STL="-I /opt/android-ndk-r17-beta2/sources/cxx-stl/stlport/stlport /opt/android-ndk-r17-beta2/sources/cxx-stl/stlport/libs/armeabi-v7a/libstlport_static.a"

$NDK_GCC $HO -shared -fPIC add.cpp -o libadd.so $NDK_STL

3.在脚本的同目录,写个测试的程序add.cpp,内容如下(复制粘贴即可):

extern “C”

int add(int a, int b)
{
return (a + b);
}
4.执行build_so.sh即可生成libadd.so,此时libadd.so准备被android studio调用;

=下边是android studio如何调用动态库部分===========

5.创建带JNI功能的android studio新工程,具体参考《ubuntu下AndroidStudio快速搭建JNI》

https://blog.csdn.net/BlackRabbit_/article/details/107788515?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160974118216780304620347%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=160974118216780304620347&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-1-107788515.pc_search_result_cache&utm_term=ubuntu%E4%B8%8BAndroidStudio%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BAJNI

6.创建jniLibs目录,添加libadd.so。修改native-lib.cpp,添加add的声明以及JNI的实现,注意声明一定要放在实现前!

img

7.修改CMake,添加下图红框部分

img

8.修改MainActivity,添加红框部分

img

9.修改build.gradle,添加红框部分

img

10.正常运行后,logcat打印

img

参考链接:

1.交叉编译-生成动态库在AndroidStudio中使用https://www.jianshu.com/p/5200e59ce9b9

2.NDK在Linux下载配置以及C、C++编译配置(交叉编译)https://www.jianshu.com/p/30e040468721

3.ubuntu下AndroidStudio快速搭建JNI https://blog.csdn.net/BlackRabbit_/article/details/107788515?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522160974118216780304620347%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=160974118216780304620347&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-1-107788515.pc_search_result_cache&utm_term=ubuntu%E4%B8%8BAndroidStudio%E5%BF%AB%E9%80%9F%E6%90%AD%E5%BB%BAJNI

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值