Android 使用SO库

别说谁变了你拦得住时间么 提交于 2020-02-25 23:34:57

使用Android Studio调用so 开发.

  • 创建项目 省略......
  • 创建jniLibs目录 在main中创建一个jniLibs文件夹

look,然后把so拷贝进去:

  • 创建JNI 的API:com.robot.msttsdemo.JniApi.java
package 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 <jni.h>  
/\* 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 <android/log.h>  
  
#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"
}
}

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!