Android-studio导入.so库问题?
ringa_lee
ringa_lee 2017-04-17 17:48:14
0
5
624

我的目录结构

一下是主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);
        // ui
        TextView 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);
        // tts
        Tts.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
        // stoplistening
        do {
            //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库的时候遇到了以上问题,我该怎么解决?
网上有人说是NDK的bug,我改了NDK版本也是同样问题,谢谢大家。

ringa_lee
ringa_lee

ringa_lee

membalas semua(5)
阿神

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

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

黄舟

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

洪涛

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

阿神

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

Peter_Zhu

这个不是有内存溢出了啊

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan