老套路先上图:

1.环境要求:(本人环境:Android Studio 4.2.2)

AS得先安装好ndk环境,也很简单 可以看我以前的帖子很老了:NDK的下载和安装附加一个图最新的图吧

2.开始新建项目编写代码

先编写调用JNI方法的工具类

package cn.yhsh.songlib;/*** @author xiayiye5* @date 2022/3/2 11:12*/
public class SongUtils {static {System.loadLibrary("songLib");}public static native String duration();public static native int length();public static native byte[] songIo();public static native byte[] coverSong(byte[] data);
}

然后可以将上面的java工具类编程成class文件

3.退回到java目录

4.开始将class文件编译成c文件 javah -jni cn.yhsh.songlib.SongUtils(javah -jni SongUtils.class文件的包名全路径)

5.在新建main目录新建一个文件夹jni

6.将上面生成的C代码文件赋值到jni文件夹并且改后缀为.c

打开c代码,开始编辑对应的JNI方法

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class cn_yhsh_songlib_SongUtils */#ifndef _Included_cn_yhsh_songlib_SongUtils
#define _Included_cn_yhsh_songlib_SongUtils
#ifdef __cplusplus
extern "C" {
#endif
/** Class:     cn_yhsh_songlib_SongUtils* Method:    duration* Signature: ()Ljava/lang/String;*/
JNIEXPORT jstring JNICALL Java_cn_yhsh_songlib_SongUtils_duration(JNIEnv *env, jclass objt) {//返回一个字符串类型,对应SongUtils.java文件里面的方法return (*env)->NewStringUTF(env, "Android 我来了!");
}JNIEXPORT jint JNICALL Java_cn_yhsh_songlib_SongUtils_length(JNIEnv *env, jclass clazz) {//返回一个int类型,对应SongUtils.java文件里面的方法return 100;
}JNIEXPORT jbyteArray JNICALL Java_cn_yhsh_songlib_SongUtils_songIo(JNIEnv *env, jclass clazz) {//    jbyteArray result = (*env)->NewByteArray(env, 100);
//    (*env)->SetByteArrayRegion(result, 0, 10, 23, (const jbyte *) 13);
//    return result;//返回一个byte数组类型,对应SongUtils.java文件里面的方法return (*env)->NewByteArray(env, 101);
}JNIEXPORT jbyteArray JNICALL
Java_cn_yhsh_songlib_SongUtils_coverSong(JNIEnv *env, jclass clazz, jbyteArray data) {
//    jbyteArray d = (*env)->NewByteArray(env, 132);//返回一个byte数组类型,对应SongUtils.java文件里面的方法return data;
}#ifdef __cplusplus
}
#endif
#endif

7.开始编辑CMake文件内容如下

cmake_minimum_required(VERSION 3.4.1)
add_library(
# 设置so文件名称.下面的名字得跟SongUtils里面的System.loadLibrary("songLib");名字保持一致
songLib# 设置这个so文件为共享.
SHARED# 指向要编译的c文件.
src/main/jni/cn_yhsh_songlib_SongUtils.c)find_library(
log-lib# Specifies the name of the NDK library that
# you want CMake to locate.
log )# Specifies libraries CMake should link to your target library. You
# can link multiple libraries, such as libraries you define in this
# build script, prebuilt third-party libraries, or system libraries.target_link_libraries(
# Specifies the target library.
# 指定目标库.下面的名字得跟SongUtils里面的System.loadLibrary("songLib");名字保持一致
songLib# Links the target library to the log library
# included in the NDK.
${log-lib} )

CMake文件里面的配置最主要就是2点,一个是c文件的路径,一个是so库的名字

8.设置生成so库的版本

在app下面的defaultConfig中添加如下

 externalNativeBuild {cmake {cppFlags ""//生成多个版本的so文件
//                abiFilters 'armeabi', 'armeabi-v7a', 'x86'abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86', 'x86_64'}}
 //配置CMakeList.txt路径externalNativeBuild {cmake {path "CMakeLists.txt"}}

9.开始生成so库文件

10.复制so库给别人调用

11.so库的引用和调用JNI方法就不用说了吧,可查看引用so库说明:so库引用说明

当然也可自行百度哦

直接使用SongUtils.方法名字即可调用(注意:个人建议将SongUtils.java打包成aar或者jar库文件这种形式给别人调用,否则别人引用之前得新建SongUtils.java这个文件的全路径,然后将SongUtils.java这个文件粘贴进去,要保持路径一致,否则会报错so库找不到!!!!)

如有看不明白:本人提供一份源码 生成so库源码

源码下载地址二

源码下载地址三

在此感谢原博主:博主直达

Android开发之NDK开发之生成so库基础入门相关推荐

  1. Android开发之Fmod开发引擎库-----变声

    最近接到一个项目需求,大概是围绕***变声***这个功能展开的. 我从来没有写过这样的项目,抱着好奇的心态百度了一番,找到了一个是为游戏开发者准备的革命性音频引擎------FMOD开发引擎库. 1. ...

  2. qt android 开发之wifi开发篇

    小编简单介绍如何通过调用android API来获取wifi服务( 非常感谢作者安晓辉发布了qt android 核心编程这本书,让我两天搞懂了很多在qt中开发安卓的要领,现在跟大家分享下!至于还没知 ...

  3. Android开发之SDK开发获取资源id报错的问题

    我们在开发SDK的时候有时候需要兼容Eclipse版本和AS版本,AS版本就不说了没多大问题,主要是Eclipse版本会有问题.当开发之使用Eclipse开发的时候接入jar包(AS打包成aar,解压 ...

  4. Android开发之NDK下载与NDK更新

    1.如下图下载更新都是一样的,首先勾选DNK选项然后点击Apply即可 2.等待下载自动解压完成就可以了 Google官方文档:安装及配置 NDK 和 CMake

  5. Android开发之ApiCloud模块开发之模块引用第三方库的问题

    因为现在第三方库比较多,所以很多人为了快速开发导致库用烂大街了,但是在模块开发中本人不建议使用第三方库的依赖会有很多问题,要么是资源图片找不到,要么是布局找不到啥的,但是有的需求只有第三方库怎么办呢? ...

  6. android 视频开发sd卡,Android开发之SD卡文件操作分析

    本文实例讲述了Android开发之SD卡文件操作.分享给大家供大家参考,具体如下: 前面的文章中写过直接操作手机自带存储器的程序,这次就接着上次文章协议下对sd卡的文件操作.与自带存储不同的是使用sd ...

  7. android开发集成flash,Android开发之Adobe flash操作工具类

    本文实例讲述了Android开发之Adobe flash操作工具类.分享给大家供大家参考,具体如下: public class AdobeUtil { /** * 安装flash插件 */ publi ...

  8. Android开发之JNI(一)--HelloWorld及遇到的错误解析

    Android开发之JNI(一)--HelloWorld及遇到的错误解析 1.NDK环境搭建 參考http://blog.csdn.net/xiaoliouc/article/details/8705 ...

  9. android之json解析优化,Android开发之json解析

    目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...

  10. Android 开发之Windows环境下Android Studio安装和使用教程(图文详细步骤)

    鉴于谷歌最新推出的Android Studio备受开发者的推崇,所以也跟着体验一下. 一.介绍Android Studio  Android Studio 是一个Android开发环境,基于Intel ...

最新文章

  1. 计算机连接外设的端口驱动,将 KMDF 外设驱动程序连接到串行端口
  2. elasticsearch 内存溢出,节点崩溃
  3. 高通 MSM8K bootloader 之三: LK
  4. 动态网页中隐藏url参数传递的方法
  5. 数据挖掘——我们能从股市数据得出什么,以及一些算法
  6. closewait一直不释放_夏至太阳庆典 || 巨蟹座日蚀新月大释放蜡烛魔法仪式(寻找新的幸运儿)...
  7. 'fopen' This function or variable may be unsafe
  8. 运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(一)
  9. 华为鸿蒙OS首批升级机型名单曝光 荣耀老机型或在第二、三批名单
  10. pythonxml格式化_使用Python生成XML的方法实例
  11. python入门——P54论一只爬虫的自我修养1
  12. oracle exp不生成dumpfile,预估出实际导出文件的大小。
  13. 云主机前景几何,风萧萧兮!
  14. mac 修改pip镜像为国内镜像
  15. 永中集成Office为何无法随意克隆(Clone)?
  16. 解决微信开发者工具无法打开的问题
  17. excel常用功能记录(不断更新)
  18. hosts文件导致无法网页观看视频
  19. 阿里云邮箱发送邮件,多人多附件
  20. 狄利克雷分布主题模型LDA

热门文章

  1. dbfs和dbm的换算_「清晰易懂」dBFS、dBm、dBV、dBW、0dB、-3dB概念解析
  2. VMware中Linux网络配置
  3. Mugeda(木疙瘩)H5案例课—拍拍员工被玩坏了-岑远科-专题视频课程
  4. JQuery22( JQ原理 Clone)
  5. 数据挖掘算法和实践(八):K-means 聚类(西瓜数据集)
  6. 微信小程序 下拉刷新 性能优化 参考饿了么小程序首页列表加载
  7. html继承有哪几种方式,JS实现继承的几种常用方式示例
  8. python分离gif_python 将GIF拆分成图片方法
  9. ShuffleNet 算法的介绍
  10. Kvaser—灵活多变的CAN总线接口方案