使用Android Studio调用so 开发.创建项目省略......

创建jniLibs目录在main中创建一个jniLibs文件夹

look,然后把so拷贝进去:

创建JNI 的API:com.robot.msttsdemo.JniApi.javapackage com.robot.msttsdemo;

public class JniApi {

//javah -classpath . -jni com.robot.msttsdemo.JniApi

public static native int tts(String text,String out_file_path,String engine_cfg_data_path);

}生成com_robot_msttsdemo_JniApi.h文件,这个命令是在当前目录:src/main/java/javah -classpath . -jni com.robot.msttsdemo.JniApi/* DO NOT EDIT THIS FILE - it is machine generated */

#include

/* Header for class com_robot_msttsdemo_JniApi */

#ifndef _Included_com_robot_msttsdemo_JniApi

#define _Included_com_robot_msttsdemo_JniApi

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: com_robot_msttsdemo_JniApi

* Method: tts

* Signature: (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)I

*/

JNIEXPORT jint JNICALL Java_com_robot_msttsdemo_JniApi_tts

(JNIEnv *, jclass, jstring, jstring, jstring);

#ifdef __cplusplus

}

#endif

#endif

然后将头文件移到jni目录:src/main/jni/,再复制一份改为com_robot_msttsdemo_JniApi.cpp#include

#define TAG "mstts" // 这个是自定义的LOG的标识

#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__) // 定义LOGD类型

#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG,__VA_ARGS__) // 定义LOGE类型

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class: com_robot_msttsdemo_JniApi

* Method: tts

* Signature: (Ljava/lang/String;Ljava/lang/String;)I

*/

JNIEXPORT jint JNICALL Java_com_robot_msttsdemo_JniApi_tts(JNIEnv *env, jclass jclass1, jstring jstring1, jstring jstring2, jstring jstring3){

const char *text = env->GetStringUTFChars(jstring1, JNI_FALSE);

const char *outfile = env->GetStringUTFChars(jstring2, JNI_FALSE);

const char *cfgdata = env->GetStringUTFChars(jstring3, JNI_FALSE);

LOGE("jni text: %s", text);

LOGE("jni outfile: %s", outfile);

LOGE("jni cfgdata: %s", cfgdata);

return 0;

}

#ifdef __cplusplus

}

#endif编译CMakeLists.txt,文件路径:src/.这个jni需要依赖libTTSEngine.so.cmake_minimum_required(VERSION 3.4.1)

add_library(Tts SHARED

${CMAKE_SOURCE_DIR}/main/jni/com_robot_msttsdemo_JniApi.cpp)

#导入第三方so包,并声明为 IMPORTED 属性,指明只是想把 so 导入到项目中

add_library( TTSEngine

SHARED IMPORTED )

#指明 so 库的路径,CMAKE_SOURCE_DIR 表示 CMakeLists.txt 的路径

set_target_properties(

TTSEngine

PROPERTIES IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/main/jniLibs/armeabi-v7a/libTTSEngine.so )

#指明头文件路径,不然会提示找不到 so 的方法

include_directories(${CMAKE_SOURCE_DIR}/main/jni/)

target_link_libraries( # Specifies the target library.

Tts

TTSEngine

android

log )安装NDK,CMake

在app gradle中添加// 配置CMakeLists.txt路径s

externalNativeBuild {

cmake {

path "src/CMakeLists.txt"

}

}

android如何使用so库,Android 使用SO库相关推荐

  1. android 6.0权限库,Android 6.0动态权限适配

    前言 最近项目发现比较多的问题是关于Android 6.0的问题,APP安装之后,在Android 6.0之后的系统,点击直接奔溃打不开,这是为什么昵?这就是Android 6.0以上的系统引入运行时 ...

  2. 解决 Android 中出现依赖多个版本支持库的问题

    解决 Android 中出现依赖多个版本支持库的问题 参考文章: (1)解决 Android 中出现依赖多个版本支持库的问题 (2)https://www.cnblogs.com/lshare/p/1 ...

  3. Android移动开发之【Android企业级项目实战教程】DAY1-图表库HelloCharts

    使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美 实际开发中经常会使用第三方的图标库显示数据,其中HelloCharts就是一款非常优秀 ...

  4. Android 自带图标库 android.R.drawable

    在xml文件中调用. android:title="@string/secure_connect" android:orderInCategory="100" ...

  5. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 )

    文章目录 一.Android 系统中调试器进程内存流程 二.编译内存调试动态库以及调试程序 三.博客资源 一.Android 系统中调试器进程内存流程 修改游戏运行中的内存 , 游戏运行之后 , 游戏 ...

  6. 【Android 逆向】Android 中常用的 so 动态库 ( /system/lib/libc.so 动态库 | libc++.so 动态库 | libstdc++.so 动态库 )

    文章目录 一.拷贝并分析 Android 中的 /system/lib/libc.so 动态库 二.拷贝并分析 Android 中的 /system/lib/libc++.so 动态库 三.拷贝并分析 ...

  7. 【Android 安装包优化】WebP 应用 ( 4.0 以下兼容 WebP | Android Studio 中使用 libwebp.so 库向下兼容版本 | libwebp 库测试可用性 )

    文章目录 一. Android Studio 中导入 libwebp.so 库 二. Android Studio 中测试 libwebp.so 库 三.参考资料 一. Android Studio ...

  8. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )

    文章目录 一.项目中配置 OpenSSL 开源库 二.OpenSSL 开源库解密参考代码 三.解密 dex 文件的 Java 代码 四.解密 dex 文件的 Jni 代码 参考博客 : [Androi ...

  9. 【Android 安全】DEX 加密 ( Java 工具开发 | 加密解密算法 API | 编译代理 Application 依赖库 | 解压依赖库 aar 文件 )

    文章目录 一.加密解密算法 API 二.编译代理 Application 依赖库 三.解压代理 Application 依赖库 aar 文件 参考博客 : [Android 安全]DEX 加密 ( 常 ...

  10. 【Android FFMPEG 开发】Android Studio 中配置 FFMPEG 库注意事项 ( 静态库 链接 libz.so 库 | 导入 FFMPEG 函数库顺序 )

    文章目录 I . 导入 z 库 ( FFMPEG 动态库 与 静态库区别 ) II . FFMPEG 库引入顺序 III . Android Studio 中 FFMPEG 静态库引入完整 CMake ...

最新文章

  1. 在VS2010中创建自定义的代码段
  2. c# 建立到数据源的连接 以及获取项目配置文件的属性
  3. 关于mvc、mvp和mvvm的理解
  4. 如何在C#中使用Win32和其他库之三
  5. 提交数据库访问性能一些简单措施
  6. 第6章:可维护性软件构建方法 6.1可维护性的度量和构造原则
  7. 云服务器选择、腾讯云轻量应用服务器面板介绍
  8. eNSP华为路由器与交换机连接
  9. 力扣LeetCode刷题笔记总结1
  10. 锁的优化机制了解嘛?请进!
  11. 进入BeOS的花花世界 系列一
  12. live555库安装_live555生成库文件
  13. mysql三m架构为什么_AnalyticDB for MySQL 3.0 技术架构解析
  14. HTML+CSS学习笔记整理-七七八八
  15. div+css静态网页设计:三亚旅游网站设计——三亚旅游网页设计(6页) html网页设计期末大作业_网页设计平时作业
  16. 基于Altium Designer进行可变电阻元件封装
  17. 初次体验PDF.JS,非常好用的pdf前台包
  18. 国内常见的IT认证都有哪些?这几个入大厂必备
  19. Linux 已修改ip地址(ONBOOT=yes),但是不显示ip地址
  20. Cobo钱包v2公测版来了,手把手教你怎么玩

热门文章

  1. activiti使用mysql,启动报错。
  2. 牛客练习赛30-A/C
  3. 汉洛塔问题(c解决)
  4. 国内云桌面架构有哪些?为什么VDI能成为主流
  5. 速解元宇宙 / Metaverse 迷雾下的行动指南
  6. Hadoop伪分布式
  7. 笔记《Graph Neural Tangent Kernel: Fusing Graph Neural Networks with Graph Kernels》-NeurIPS 2019
  8. 全国总决赛前八名成绩
  9. 【注释说明】pcl库中OBB和AABB包围盒头文件pcl/features/moment_of_inertia_estimation.h,中文翻译注释说明,欢迎补充
  10. 人生如逆旅,我亦是行人——与余光中先生握一次手(二)