多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 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"); ~~~