使用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"
}
}
来源:oschina
链接:https://my.oschina.net/lsfx/blog/3159953

