最近線上報了一個java.lang.UnsatisfiedLinkError
的錯誤,發現環信內部沒有將某個loadLibrary
方法try catch(error),可是其內部的_loadLibrary
方法是try catch(error)的,因此準備作如下修改: 爲hyphenatechat_3.4.2.jar
中的EMClient.class
文件中的loadLibrary
方法作如下替換:html
private static void loadLibrary() {
if (!libraryLoaded) {
_loadLibrary("sqlite");
_loadLibrary("hyphenate_av");
_loadLibrary("hyphenate_av_recorder");
System.loadLibrary("hyphenate");
libraryLoaded = true;
}
}
複製代碼
替換爲java
private static void loadLibrary() {
if (!libraryLoaded) {
_loadLibrary("sqlite");
_loadLibrary("hyphenate_av");
_loadLibrary("hyphenate_av_recorder");
_loadLibrary("hyphenate");
libraryLoaded = true;
}
}
複製代碼
Windowsandroid
jar xvf oldJar.jar
命令解壓縮oldJar到當前目錄下;jd-gui
驗證newClass文件是否正確;jar cvfm META-INF\MANIFEST.MF newJar.jar *
命令將當前目錄下的全部文件壓縮成newJar,而且使用環信生成的MANIFEST.MF;package com.fqxyi.androidutils.test;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
/** * Java方法測試類 */
public class JavaTest {
public static void main(String[] args) {
try {
modifyClass();
} catch (Exception e) {
e.printStackTrace();
}
}
private static void modifyClass() throws Exception {
ClassPool pool = ClassPool.getDefault();
//設置目標類的路徑
pool.insertClassPath("C:\\Users\\Administrator\\Desktop\\hyphenatechat_3.4.2\\") ;
//得到要修改的類
CtClass cc =pool.get("com.hyphenate.chat.EMClient");//就是對EMClient.class的映射
//獲得方法
CtMethod m = cc.getDeclaredMethod("loadLibrary");
//能夠在函數的開頭插入新的代碼
//m.insertBefore("{return true;}") ;
//也能夠自定義loadLibrary方法的內容
m.setBody("{if (!libraryLoaded)\n" +
" {\n" +
" _loadLibrary(\"sqlite\");\n" +
" _loadLibrary(\"hyphenate_av\");\n" +
" _loadLibrary(\"hyphenate_av_recorder\");\n" +
" _loadLibrary(\"hyphenate\");\n" +
" libraryLoaded = true;\n" +
" }}");
//保存到文件裏,會在項目根目錄下生成一個EMClient.class,並無自動替換EMClient.class,須要本身手動替換進去
cc.writeFile() ;
}
}
複製代碼
AOP:之後總結git