# Android自助餐之Jni(三)動態導入so文件
- [Android自助餐之Jni三動態導入so文件](#)
- [拷貝so文件](#)
- [創建jni對應類](#)
- [FileUtil類](#)
- [在需要的地方調用](#)
下載[完整源代碼](http://download.csdn.net/detail/xmh19936688/9395115)
### 拷貝so文件
假設so文件放在assets目錄下
創建assets文件夾:在main文件夾上右鍵->new->folder->AssetsFolder
將so文件及其文件夾(armeabi等)復制到assets文件夾
### 創建jni對應類
本實例已知c文件內容如下
~~~
JNIEXPORT jstring JNICALL
Java_com_xmh_jni_JniUtil_getResult(JNIEnv *env,jobject obj,jstring value){
char * str;
str=(*env)->GetStringUTFChars(env,value,NULL);
sprintf(str,"%s-_-%s",str,str);
return (*env)->NewStringUTF(env, str);
}
~~~
因此所創建的類完整類名為:com.xmh.jni.JniUtil。文件內容如下
~~~
public class JniUtil {
/*封裝native方法,先加載so文件后調用native方法*/
public String getResult(Context context,String value){
loadLibrary(context);
return getResult(value);
}
/*加載so文件*/
private void loadLibrary(Context context) {
try {
//獲取文件輸入流
InputStream inStream = context.getAssets().open("armeabi/libJniLibDemo.so");
//獲取文件輸出流:目錄是/data/data/app包名/app_lib/(該目錄為app私有目錄,具有執行權限)
File libsDir = context.getDir("libs", Context.MODE_PRIVATE);
String soFilePath=libsDir.getAbsolutePath() + "/libJniLibDemo.so";
FileOutputStream outStream = new FileOutputStream(soFilePath);
//使用兩個流復制文件
FileUtil.copyFile(inStream,outStream);
//加載so文件
System.load(soFilePath);
} catch (Exception e) {
e.printStackTrace();
}
}
public native String getResult(String value);
}
~~~
### FileUtil類
該類用于文件復制
~~~
public class FileUtil {
public static void copyFile(InputStream inStream, FileOutputStream outStream) throws IOException {
int bytesum = 0;
int byteread = 0;
byte[] buffer = new byte[1444];
int length;
while ( (byteread = inStream.read(buffer)) != -1) {
bytesum += byteread; //字節數 文件大小
System.out.println(bytesum);
outStream.write(buffer, 0, byteread);
}
outStream.flush();
}
}
~~~
### 在需要的地方調用
~~~
new JniUtil().getResult(this,"xmh");
~~~