失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > JAVA JNI调用科大讯飞离线语音合成(Linux篇)

JAVA JNI调用科大讯飞离线语音合成(Linux篇)

时间:2020-05-07 04:26:30

相关推荐

JAVA JNI调用科大讯飞离线语音合成(Linux篇)

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

如果觉得《JAVA JNI调用科大讯飞离线语音合成(Linux篇)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。