JNI调用科大讯飞离线语音合成(Linux篇)
背景:之前已经介绍过JNI调用科大讯飞离线语音合成(Windows篇),今天我们接着聊一聊在Linux系统中如何使用科大讯飞离线语音合成,我们这里以(ubuntu)为例。
这里着重感谢以下博友的优秀文章,给了我很大帮助
Java web 项目中使用JNI技术(如何在运行时改变 java.library.path并生效
如何在运行时改变 java.library.path并生效
JNI错误之:error: base operand of ‘->’ has non-pointer type ‘_JNIEnv’
JNI中很有用的jstring 与 const char* 的相互转换函数
Linux C语言调用C++动态链接库-改
开始编码
1.1 开始编写java代码
import java.lang.reflect.Field;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class NativeKeDa {private static final Logger LOGGER = LoggerFactory.getLogger(NativeKeDa.class);public static void setLibraryPath(String path) throws Exception {System.setProperty("java.library.path", path);final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths");sysPathsField.setAccessible(true);sysPathsField.set(null, null);}static {// Linux系统中准备加载动态库(.so库)的位置String javaLibraryPath = "/kedaxunfei/lib/";try {setLibraryPath(javaLibraryPath);System.loadLibrary("kedaxunfei");} catch (Exception e) {LOGGER.error(e.getMessage(), e);LOGGER.error("Native code library failed to load.\n" + e);}}public native int text2Speech(String content, String params, String filePath);public native void sayHello();}
1.2 生成.h 头文件
请参考JNI调用科大讯飞离线语音合成(Windows篇)/qq_34620527/article/details/89237601
1.3 编写 .cpp 文件,这里不能编写为 .c 文件,因为编写 .c 文件链接 libmsc.so 库时有问题
其他内容与 .c 文件相同char * jstringToChar( JNIEnv * env, jstring jstr ){char * rtn = NULL;jclass clsstring = env->FindClass("java/lang/String");jstring strencode = env->NewStringUTF("UTF-8");jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr,mid,strencode);jsize alen = env->GetArrayLength(barr);jbyte * ba = env->GetByteArrayElements(barr,JNI_FALSE);if(alen > 0){rtn = (char*)malloc(alen+1); //new char[alen+1];memcpy(rtn,ba,alen);rtn[alen]=0;}env->ReleaseByteArrayElements(barr,ba,0);return rtn;}
1.4 将.cpp 文件上传至Linux系统中,在.cpp文件目录中编译 .so 文件,这里需要使用 g++命令,命令如下:
g++ -fPIC -D_REENTRANT -shared -o libkedaxunfei.so kedaxunfei.cpp -I "$JDKPath$/include" -I "$JDKPath$/include/linux" -I "./" /**/**/**/libmsc.so 注意:libmsc.so 使用Linux中绝对路径-I "./" 这里将科大讯飞 .h 文件和我们生成的 .h 文件放到一起了,因此这里也可以省略
至此完成Linux JNI调用科大讯飞离线语音合成
欢迎大家留言技术交流
参考资料
Java web 项目中使用JNI技术(如何在运行时改变 java.library.path并生效)
/article/14702
如何在运行时改变 java.library.path并生效
/entry/150717
JNI错误之:error: base operand of ‘->’ has non-pointer type ‘_JNIEnv’
/fevershen/article/details/78645202
JNI中很有用的jstring 与 const char* 的相互转换函数
/liaowenfeng/article/details/8668085
Linux C语言调用C++动态链接库-改
/water_cow/article/details/45313339