Android-studio導(dǎo)入.so庫問題?
問題描述
我的目錄結(jié)構(gòu)
一下是主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; //準(zhǔn)備讀的文字 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可能是 調(diào)整語速的id 后面的-11000 是它的值。 比如Tts.JniSetParam(1282, -15000); 改成這個就說話速度快了。//Tts.JniSetParam(1280, 4); 這個是別的參數(shù) 看看改4 這個數(shù)字看看 我也不知道是什么//Tts.JniSetParam(1297, 20); 這個是別的參數(shù) 看看改20 這個數(shù)字看看 我也不知道是什么//Tts.JniSetParam(1282, 20000); 這個是別的參數(shù) 看看改20000 這個數(shù)字看看 我也不知道是什么 } @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參數(shù)是文字 給什么文字就讀什么文字。 此代碼只是維吾爾語言的離線合成。Tts.JniSpeak(text);//1。在這兒關(guān)閉語音助手的識別 stoplistening// stoplisteningdo { //2.這個的作用是 等到 語音合成結(jié)束時前 不要執(zhí)行任何事情}while (Tts.JniIsPlaying()==0);//3.語音合成結(jié)束后 在這兒開啟語音識別 starlistining .//starlistining//總結(jié):通過1,2,3步驟可以實習(xí) 對助手說 你好 它回答 我好 的時候 這個“我好”防止被語音識別再一次聽到自己的聲音。 第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導(dǎo)入一個.so庫的時候遇到了以上問題,我該怎么解決?網(wǎng)上有人說是NDK的bug,我改了NDK版本也是同樣問題,謝謝大家。
問題解答
回答1:如果是你自己編譯的,不會有這個問題,如果有別人的庫,你用nm -Do libyourso.so查看一下他的包結(jié)構(gòu),然后在你的src/main/java下建一個相同的包路徑,把class名也改成和對方一樣
另外,如果用別人的,-v7a -v8a x86 x86_64每個單獨測試,我以前也遇到過這個問題,非常不穩(wěn)定,有時能過有時不能過。把不需要的so及目錄刪除,逐個測試,留 下能過的那個so就行了
回答2:你確定是導(dǎo)入so庫造成的問題么?如果是,你可以試試刪除-v7a -v8a x86 x86_64這些文件夾,然后試一下。或者在這些文件夾下放對應(yīng)格式的.so文件
回答3:這樣我們也無法確切知道問題在哪,我建議,你可以先做個調(diào)用so的demo,so里面就寫一個簡單的方法,對應(yīng)java里面一個方法,方法命名都檢查清楚,一一對應(yīng),把so文件先只放在armeabi文件夾下,然后再按照網(wǎng)上的介紹的一些例子試著把這一個方法調(diào)試成功,成功了然后再去試著調(diào)試你上面的代碼
回答4:No JNI_OnLoad found in問題多半是java包名與生成so的C或C++代碼的函數(shù)名不一致導(dǎo)致,你的so是你自己編譯的還是直接copy別人的?
回答5:這個不是有內(nèi)存溢出了啊
相關(guān)文章:
1. 數(shù)組按鍵值封裝!2. java - web項目中,用戶登陸信息存儲在session中好 還是cookie中好,取決于什么?3. angular.js - webpack build后的angularjs路由跳轉(zhuǎn)問題4. mysql - 大部分?jǐn)?shù)據(jù)沒有行溢出的text字段是否需要拆表5. mysql federated引擎無法開啟6. mysql 新增用戶 主機名設(shè)定 失敗7. 單擊登錄按鈕無反應(yīng)8. ubuntu - mysql 連接問題9. mysql - 查詢字段做了索引為什么不起效,還有查詢一個月的時候數(shù)據(jù)都是全部出來的,如果分拆3次的話就沒問題,為什么呢。10. mysql儲存json錯誤
