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庫的時候遇到了以上問題,我該怎么解決?網上有人說是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:這個不是有內存溢出了啊
相關文章:
