您的位置:首页技术文章
文章详情页

Android-studio导入.so库问题?

【字号: 日期:2024-08-30 14:45:46浏览:77作者:猪猪

问题描述

我的目录结构Android-studio导入.so库问题?

一下是主activity

package com.iflytek.tts;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import com.iflytek.tts.TtsService.Tts;import com.iflytek.tts.R;public class TtsJniDemo extends Activity implements View.OnClickListener { //在lib目录下有AisoundDemo.so 文件 private static final String TAG = 'AisoundDemo'; private TextView txtView; //准备读的文字 private String text = 'ياخشىمۇسىز'; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);// uiTextView textView = (TextView) findViewById(R.id.textView);EditText editText = (EditText) findViewById(R.id.editText);Button startButton = (Button) findViewById(R.id.startButton);Button stopButton = (Button) findViewById(R.id.stopButton);startButton.setOnClickListener(this);stopButton.setOnClickListener(this);if (!editText.getText().toString().equals('')){ text = editText.getText().toString();}textView.setText(text);// ttsTts.JniCreate('/sdcard/Resource.irf');Tts.JniSetParam(1282, -11000);//1282可能是 调整语速的id 后面的-11000 是它的值。 比如Tts.JniSetParam(1282, -15000); 改成这个就说话速度快了。//Tts.JniSetParam(1280, 4); 这个是别的参数 看看改4 这个数字看看 我也不知道是什么//Tts.JniSetParam(1297, 20); 这个是别的参数 看看改20 这个数字看看 我也不知道是什么//Tts.JniSetParam(1282, 20000); 这个是别的参数 看看改20000 这个数字看看 我也不知道是什么 } @Override public void onClick(View v) {switch (v.getId()){ case R.id.startButton:onClickStart();break; case R.id.stopButton:onClickStop();break;} } public void onClickStop(){//Tts.JniStop(); } public void onClickStart(){//JniSpeak参数是文字 给什么文字就读什么文字。 此代码只是维吾尔语言的离线合成。Tts.JniSpeak(text);//1。在这儿关闭语音助手的识别 stoplistening// stoplisteningdo { //2.这个的作用是 等到 语音合成结束时前 不要执行任何事情}while (Tts.JniIsPlaying()==0);//3.语音合成结束后 在这儿开启语音识别 starlistining .//starlistining//总结:通过1,2,3步骤可以实习 对助手说 你好 它回答 我好 的时候 这个“我好”防止被语音识别再一次听到自己的声音。 第3步是 说完 “我好” 后自动就开启识别了。等待用户再一次说话。 这和地方在用户多轮交流时有用。 }}

以下是Tts.java

package com.iflytek.tts.TtsService;//import com.iflytek.tts.MessageDemo;import com.iflytek.tts.TtsJniDemo;public final class Tts{ static {System.loadLibrary('Aisound'); } public static String getString; /** * */ public synchronized static void startReadThread(TtsJniDemo ttsJniDemo){class TtsRunThread implements Runnable { @Override public void run() {JniSpeak(getString); }}Thread ttsRun = (new Thread(new TtsRunThread()));ttsRun.setPriority(Thread.MAX_PRIORITY);ttsRun.start(); } public static native int JniGetVersion(); public static native int JniCreate(String resFilename); public static native int JniDestory(); public static native int JniStop(); public static native int JniSpeak(String text); public static native int JniSetParam(int paramId,int value); public static native int JniGetParam(int paramId); public static native int JniIsPlaying(); public static native boolean JniIsCreated();}

以下是错误信息Android-studio导入.so库问题?

我在android-studio导入一个.so库的时候遇到了以上问题,我该怎么解决?网上有人说是NDK的bug,我改了NDK版本也是同样问题,谢谢大家。

问题解答

回答1:

如果是你自己编译的,不会有这个问题,如果有别人的库,你用nm -Do libyourso.so查看一下他的包结构,然后在你的src/main/java下建一个相同的包路径,把class名也改成和对方一样

另外,如果用别人的,-v7a -v8a x86 x86_64每个单独测试,我以前也遇到过这个问题,非常不稳定,有时能过有时不能过。把不需要的so及目录删除,逐个测试,留 下能过的那个so就行了

回答2:

你确定是导入so库造成的问题么?如果是,你可以试试删除-v7a -v8a x86 x86_64这些文件夹,然后试一下。或者在这些文件夹下放对应格式的.so文件

回答3:

这样我们也无法确切知道问题在哪,我建议,你可以先做个调用so的demo,so里面就写一个简单的方法,对应java里面一个方法,方法命名都检查清楚,一一对应,把so文件先只放在armeabi文件夹下,然后再按照网上的介绍的一些例子试着把这一个方法调试成功,成功了然后再去试着调试你上面的代码

回答4:

No JNI_OnLoad found in问题多半是java包名与生成so的C或C++代码的函数名不一致导致,你的so是你自己编译的还是直接copy别人的?

回答5:

这个不是有内存溢出了啊

相关文章: