android 编写so教学,用AS编写第一个so

用AS编写第一个so

我的gradle是3.5.1, Android Studio的版本是3.5.1

找了两个小时的博客, 硬是没找到能用的... 算了, 自力更生, 丰衣足食

0x00 环境配置

确定安装了ndk, cmake, LLDB

1460000020604705

1460000020604706?w=800&h=523

新建项目的时候, 记得选择Native C++

之前版本的include c++ support选项在这个版本中已经独立出去了...

1460000020604707?w=482&h=490

1460000020604708?w=800&h=651

1460000020604709

1460000020604710

先配置好sdk的路径: File->Project Structure...->SDK Location-> Android SDK Location

1460000020604711

1460000020604712

在Android视图下, 打开local.properties, 看到ndk的路径已经配置完成

1460000020604713?w=800&h=385

0x02 声明native方法

新建一个类, 声明native方法. 这个类是java与C/C++交互的中介, 方法由java声明, 由C/C++实现

这里为了方便接下来的操作, 切换成Project视图

1460000020604714

1460000020604715

1460000020604716

public class myJNI {

static {

System.loadLibrary("JniTest"); // 要加载的so的名字

}

public static native String sayHello();

}

虽然这里的sayHello()方法报错了, 但是不用管

0x03 编译与头文件的生成

使用javac编译上述文件, 生成class文件

1460000020604717?w=542&h=800

1460000020604718?w=800&h=665

确认自己的包名和类名, 然后在java目录使用 javah 包名.类名 命令生成.h头文件, 然后就能看到生成了一个.h文件

注意一定要在java层目录下输入命令, 不然不会报错: 找不到xxx类

1460000020604719

将生成的com_example_test_myJNI.h拖到cpp目录下

1460000020604720

然后删掉原来cpp目录下的native-lib.cpp

1460000020604721

0x04 实现头文件的函数

在cpp目录下新建main.c

1460000020604722

1460000020604723

main.c中的内容, 首先是将头文件包括进来, 然后实现头文件中的sayHello方法

1460000020604724?w=800&h=277

#include "com_example_test_myJNI.h"

JNIEXPORT jstring JNICALL Java_com_example_test_myJNI_sayHello(JNIEnv *env, jclass jobj)

{

return (*env)->NewStringUTF(env,"hello 52pojie!");

}

注意: 这时候可以看到上面报错了, 先别管, 下面我们就来解决它

由于我们使用CMake来生成so的, 所以要修改CMakeLists.txt来指定so名称和so的源文件的相对路径

1460000020604725?w=800&h=310

1460000020604726?w=800&h=333

然后sync一下

1460000020604727

发现main.c已经不报错了

1460000020604728?w=800&h=282

0x05 生成so库

Build->Rebuild Project来生成so库

1460000020604729?w=603&h=416

生成的so在app\build\intermediates\cmake\debug\obj\或者app\build\intermediates\merged_native_libs\debug\out\lib或者app\build\intermediates\stripped_native_libs\debug\out\lib\

ps: 这几个路径中的so库, 我暂时不知道区别在哪...哪位大佬知道的话, 麻烦留言说一声.

1460000020604730?w=384&h=800

注意: 这里的so名字 = lib+ 我们在CmakeLists.txt中起的名字 + .so

0x06 配置so库

在app/src/main下新建jniLIB目录, 并将生成的SO文件拷贝到该文件夹下

这里的so库, 我测试的时候选择的是app\build\intermediates\merged_native_libs\debug\out\lib路径下的, 其他的请自测

1460000020604731

1460000020604732?w=358&h=695

0x07 调用

打开MainActivity插入一条log来调用so中的sayHello方法,并连接手机调试

1460000020604733

1460000020604734

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值