這個是一個定製庫的例子。
用法及注意事項:
1. 將語音庫Aisound.so,放在:
libs\armeabi\libAisound.so。
注意:armeabi目錄下的庫,都要加上lib的首碼,為了方便調用。
2. resource.irf 檔案:
先將它打包到apk裡,放在如下路徑。
\res\raw\resource.irf
然後在程式啟動並執行時候,讀取並解壓到軟體目錄,拿到路徑及檔案名稱。
3.使用
3.1 初始化庫
System.loadLibrary("Aisound");
注意:這個("Aisound");指的就是那個libAisound.so。
3.2 產生resource.irf到本機存放區
代碼:
try {
InputStream stream = getResources().openRawResource(R.raw.resource);
OutputStream out = openFileOutput("resource.irf",
Activity.MODE_PRIVATE);
// OutputStream out = openFileOutput("/sdcard/Resource.irf", Activity.MODE_PRIVATE);
byte buf[] = new byte[16384];
int numread = 0;
do {
numread = stream.read(buf);
if (numread <= 0) {
break;
} else {
out.write(buf, 0, numread);
}
} while (true);
out.close();
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
注意標紅的部分,這個檔案直接寫到:/data/data/xxxxxx/files/resource.irf
3.3 初始化引擎
Tts.JniCreate("/data/data/xxxxxx/files/resource.irf");
Tts.JniSetParam(256, 1);
Tts.JniSetParam(1280, 20);
請注意標紅,這個是軟體的路徑。也就是我需要把resource.irf檔案寫到這個路徑下。當然也可以寫到sd卡上或儲存上。
3.4 使用
不說了,自己封裝吧!
備忘:
這裡要說的問題:
1.關於庫的調用,由於封裝的時候制定了包名和類名,所以在調用如下介面時
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();
必須使用預設編譯的包名和類名。如果想改類名,那麼對不起,要重新編介面函數哦! 當時我大意了,浪費了好多時間。
2.關於.irf檔案使用
目前介面是使用檔案路徑,所以要將他打包,然後解壓到本機存放區。
還可以直接修改介面,使其直接使用流的方式,我看了,好像是char型
為了以後版本庫可以更新,我沒有去判斷檔案是否存在,而是程式每次啟動都去組建檔案。我不知道怎麼去判斷是新的庫,利用檔案大小?
作者:lxmhuendan