Android | 第一个SO库

一、Android NDK开发

参考之前的博文:

项目记录 | Android NDK开发相关

二、Android SO库

参考之前的博文:

关于Android的SO库

三、第一个SO库制作

介绍一下如何往已有工程添加SO库。一起动手实践第一个SO库。主要的步骤如下:

3.1 在main目录下新建jni目录

在这里插入图片描述

3.2 找到项目的gradle.properties,添加一行 android.useDeprecatedNdk=true

在这里插入图片描述

3.3 在jni目录下添加一个空的C/CPP源文件

在这里,我创建了一个空的hello.cpp
在这里插入图片描述

3.4 在jni目录下添加Android.mk和Application.mk 并在build.gradle添加配置

Android.mk的作用:指定源码编译的配置信息,如如工作目录,编译模块的名称,参与编译的文件等。

LOCAL_PATH := $(call my-dir)
// 设置工作目录,而my-dir则会返回Android.mk文件所在的目录
include $(CLEAR_VARS)
// 清除几乎所有以LOCAL——PATH开头的变量(不包括LOCAL_PATH)
LOCAL_MODULE := helloJni
// 设置模块的名称,即编译出来libhelloJni.so文件名
// 注,要和上述步骤中build.gradle中NDK节点设置的名字相同
LOCAL_SRC_FILES := hello.cpp
// 指定参与模块编译的C/C++源文件名
LOCAL_LDLIBS := -lm -llog
include $(BUILD_SHARED_LIBRARY) 
// 指定生成的静态库或者共享库在运行时依赖的共享库模块列表
  • 注意,一定不要有空格。

Application.mk的作用:配置编译平台相关内容。

APP_PLATFORM := android-16
// APP_PLATFORM最低支持的AndroidAPI版本
APP_ABI := armeabi-v7a 
// 最常用的APP_ABI字段:指定需要基于哪些CPU平台的.so文件

build.gradle主要是指定上述二个文件的路径,写法如下:
在这里插入图片描述

3.5 定义java层的native方法,并通过javah生成C++层的函数声明

在java层引用so库,声明native方法,如下所示:
在这里插入图片描述
那么接下来,我们要生成这个native方法在C/CPP层的声明,详见【Android Studio 快速生成jni头文件】

3.5.1 配置External Tools。点击File->settings->ExternalTools->点击绿色加号

在这里插入图片描述

配置javah工具

Name: javah
Description: javah
Group: NDK
Program: javah.exe 注意:这里选择javah.exe所在的路径(在jdk安装路径里)
Parameters: -classpath . -jni -encoding $FileEncoding$ -d $ModuleFileDir$/src/main/jni $FileClass$
Working directory: $ModuleFileDir$/src/main/java

在这里插入图片描述
生成native方法的C/C++层函数定义。

一般的定义形式为:

JNIEXPORT 返回类型 JNICALL Java_包名_类名_方法名(JNIEnv *env, 原有参数列表...);

方法是:通过对native函数所在的java文件右键NDK->javah,即可生成一个C/C++层函数定义。
如图所示:
在这里插入图片描述
生成的结果:
在这里插入图片描述

3.6 将该声明拷贝到hello.cpp,并删除刚才生成的那个文件,我们就可以实现内部的功能了。

或者不删除,在CPP函数中include这个头文件也行。
在这里插入图片描述

3.7 Demo

【GitHub-TestJNI-Demo】

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值