androidso文件路径|如何获取android项目下某个文件的绝对路径

androidso文件路径|如何获取android项目下某个文件的绝对路径的第1张示图

『壹』 如何获取android项目下某个文件的绝对路径

比如要获取 要获取libjnixcld.so绝对路径File file=new File("/data/data/com.dtBank.app.service/lib/libjnixcld.so")简单的说就是/data/data/packagename/你的文件夹名称/文件名非隐藏文件可以这样获取以上方法只能获取动态共享库的绝对路径对于像minde.dat,public.dat以及其他一些文件获取路径的方式如下:一,将文件放入assets文件夹下面(放入此文件夹下面的文件可通过InputStream in=context.getAssets().open("public.dat"));获得其二进制形式的流,具体例子如下package com.dtBank.app.service;import java.io.File;import java.io.FileOutputStream;import java.io.InputStream;import java.io.OutputStream;import android.content.Context;import android.os.Environment;import android.util.Log;/** * 获得加密文件的路径 * @author hb * */public class getEncryptionFilePath {class Obj{InputStream in;String fileDir;String folder;}String lock="";private void getCryptFilePath(Obj obj){synchronized(lock){try{if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {File cryptDir= new File(obj.folder);Log.v("bb","创建的文件夹:"+obj.folder);cryptDir.mkdirs();OutputStream os= new FileOutputStream(obj.fileDir);byte[] buf = new byte[1024*10];int l;Log.v("bb","开始写文件");InputStream in=obj.in;while ((l = in.read(buf)) != -1) {os.write(buf, 0, l);os.flush();} Log.v("bb","文件已写完");os.close();in.close(); }}catch(Exception e){e.printStackTrace();}}}// 调用此方法获取文件在sdcard上面的绝对路径public void execute(Context context){ InputStream in=null; OutputStream out=null;try{in =(context.getAssets().open("mixed.dat"));String fileDir_mixed="/sdcard/xcloudmixed/mixed.dat";final Obj obj=new Obj();obj.in=in;obj.fileDir=fileDir_mixed;obj.folder="/sdcard/xcloudmixed";new Thread(){@Overridepublic void run(){getCryptFilePath(obj);}}.start();in =(context.getAssets().open("public.dat"));String fileDir_public="/sdcard/xcloudpublic/public.dat";final Obj obj1=new Obj();obj1.in=in;obj1.fileDir=fileDir_public;obj1.folder="/sdcard/xcloudpublic";new Thread(){@Overridepublic void run(){getCryptFilePath(obj1);}}.start();}catch(Exception e){e.printStackTrace();}}}

『贰』 android so文件是什么

so文件是来unix的动态连接源库,是二进制文件,作用相当于windows下的.dll文件。补充:在Android中调用动态库文件(*.so)都是通过jni的方式。Android中加载so文件的提供的API:void System.load(String pathName); 说明:pathName:文件名+文件路径;

『叁』 android studio中怎么编译出多个so文件路径

Android Studio中jar包放在libs目录下,jni编译的so库存放在libs目录下的armeabi目录中。 导入步骤: 1. 右键app目录,find path,即打开app目录。 2. 在libs目录下新建文件夹,名字为 armeabi,注意名字不能改。 3. 将jar复制到libs目录下

『肆』 Android 如何查找so文件所在目录,安装APK时so安装到哪个目录

so安装到对应分区 system/data 下面的lib里 对应程序的文件夹中 记得改权限

『伍』 android ndk 怎样调用第三方的so库文件

问题描述:Android如何调用第三方SO库;已知条件:SO库为Android版本连接库(*.so文件),并提供了详细的接口说明;已了解解决方案:1.将SO文件直接放到libs/armeabi下,然后代码中System.loadLibrary("xxx");再public native static int xxx_xxx_xxx();接下来就可以直接调用xxx_xxx_xxx()方法;2.第二种方案,创建自己的SO文件,在自己的SO文件里调用第三方SO,再在程序中调用自己的SO,这种比较复杂,需要建java类文件,生成.h文件,编写C源文件include之前生成的.h文件并实现相应方法,最后用android NDK开发包中的ndk-build脚本生成对应的.so共享库;求解:1.上面两种方案是否可行?不可行的话存在什么问题?2.两种方案有什么区别?为什么网上大部都是用的第二种方案?3.只有一个*.so文件,并提供了详细的接口说明,是否可在ANDROID中使用它?首先要看这个SO是不是JNI规范的SO,比如有没有返回JNI不直接支持的类型。也就是说这个SO是不是可以直接当作JNI来调用。如果答案是否定的,你只能选第二个方案。如果答案是肯定的,还要看你是不是希望这个SO的库直接暴露给JAVA层,如果答案是否定的,你只能选第二个方案,比如你本身也是一个库的提供者。一般如果你只有SO,就说明这个是别人提供给你的,你可以要求对方给你提供配套的JAVA调用文件。1、这个要看这个SO是不是符合JNI调用的规范。还要看你自己的意愿。2、因为第二种方法最灵活,各种情况都可以实现。3、可以看能不能直接从JAVA调用的最简单的方法就是看SO里的函数名是不是Java_XXX_XXX_XXX格式的是就可以,你可以自己写一个配套的JAVA文件,注意一下SO函数名和JAVA函数名的转换规则,或者向SO提供方索要;不是的话就选第二种方案吧。1、检查所需文件是否齐全使用第三方动态库,应该至少有2个文件,一个是动态库(.so),另一个是包含动态库API声明的头文件(.h)2、封装原动态库原动态库文件不包含jni接口需要的信息,所以我们需要对其进行封装,所以我们的需求是:将libadd.so 里面的API封装成带jni接口的动态3、编写库的封装函数libaddjni.c根据前面生成的com_android_libjni_LibJavaHeader.h 文件,编写libaddjni.c,用来生成libaddjni.soAndroid中集成第三方软件包(.jar, .so)Android中可能会用到第三方的软件包,这包括Java包.jar和Native包.so。jar包既可通过Eclipse开发环境集成,也可通过编译源码集成,看你的工作环境。假定自己开发的程序为MyMaps,需要用到BaiMaps的库,包括mapapi.jar和libBMapApiEngine_v1_3_1.so。一、Eclipse中集成第三方jar包及.so动态库MyMaps工程下创建目录libs以及libs/armeabi,把mapapi.jar放在的libs/目录下,把libBMapApiEngine_v1_3_1.so放在libs/armeabi/下。Eclipse中把第三方jar包mapapi.jar打包到MyMaps的步骤:1. 右击工程,选择Properties;2. Java Build Path,选择Libraries;3. Libraries页面点击右面按钮“Add Library…”;4. 选择“User Library”,点击“Next”;5. 点击“User Libraries”按钮;6. 在弹出界面中,点击“New…”;7. 输入“User library name”,点击“OK”确认;8. 返回之后,选择刚刚创建的User library,右面点击“AddJARs”;9. 选择MyMaps/libs/下的mapapi.jar;10. 确认,返回。这样,编译之后,该jar包就会被打进MyMaps.apk中,libBMapApiEngine_v1_3_1.so也被打包在lib/armeabi/中。程序运行过程中,libBMapApiEngine_v1_3_1.so被放在/data/data/<yourAppPackage>/lib/下,加载动态库时系统会从程序的该lib/目录下查找.so库。二、源码中集成第三方集成jar包及.so动态库Android源码中MyMaps放在packages/apps下。MyMaps下创建目录libs以及libs/armeabi,并把mapapi.jar放在libs/,把libBMapApiEngine_v1_3_1.so放在libs/armeabi。2.1 修改Android.mk文件Android.mk文件如下:[plain] view plainLOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_STATIC_JAVA_LIBRARIES := libmapapiLOCAL_SRC_FILES := $(call all-subdir-java-files)LOCAL_PACKAGE_NAME := MyMapsinclude $(BUILD_PACKAGE)##################################################include $(CLEAR_VARS)LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES :=libmapapi:libs/mapapi.jarLOCAL_PREBUILT_LIBS :=libBMapApiEngine_v1_3_1:libs/armeabi/libBMapApiEngine_v1_3_1.soLOCAL_MODULE_TAGS := optionalinclude $(BUILD_MULTI_PREBUILT)# Use the following include to make our testapk.include $(callall-makefiles-under,$(LOCAL_PATH))1 集成jar包LOCAL_STATIC_JAVA_LIBRARIES取jar库的别名,可以任意取值;LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES指定prebuiltjar库的规则,格式:别名:jar文件路径。注意:别名一定要与LOCAL_STATIC_JAVA_LIBRARIES里所取的别名一致,且不含.jar;jar文件路径一定要是真实的存放第三方jar包的路径。编译用BUILD_MULTI_PREBUILT。2 集成.so动态库LOCAL_PREBUILT_LIBS指定prebuilt so的规则,格式:别名:so文件路径。注意:别名一般不可改变,特别是第三方jar包使用.so库的情况,且不含.so;so文件路径一定要是真实的存放第三方so文件的路径。编译拷贝用BUILD_MULTI_PREBUILT。2.2 加入到GRANDFATHERED_USER_MODULES在文件user_tags.mk中,把libBMapApiEngine_v1_3_1加入到GRANDFATHERED_USER_MODULES中[plain] view plainGRANDFATHERED_USER_MODULES += \… \libBMapApiEngine_v1_3_1user_tags.mk可以是build/core下的,也可以是$(TARGET_DEVICE_DIR)下的,推荐修改$(TARGET_DEVICE_DIR)下的。2.3 编译结果MyMaps.apk编译生成在out/target/proct/<YourProct>/system/app/下;libBMapApiEngine_v1_3_1.so放在out/target/proct/<YourProct>/system/lib/下,这也是系统加载动态库时搜索的路径。

『陆』 android studio 怎么打开so文件

先在Android studio导入一个项目,然后进入到项目中,依次进入到app>>src>>main下。在main的文件下版进行创建一个jnilibs,然权后选中main的文件,进行右键,弹出框中点击“new”,移动下一级菜单中选择“directory”。对创建的文件夹进行昵称,在昵称中进行输入“jnilibs”,然后点击“ok”。这样在main的文件中创建一个为jnilibs的文件夹。然后在jinlibs中文件进行添加so的文件,进入到so文件存放的文件中,直接把so的文件拖动到jinlibs的文件中。拖动完成之后,会提示一个确认款提示信息,直接点击“ok”即可。在non-project file access中第一个希望编辑文件,第二个为咱想在当前会话中编辑任何非项目文件,根据的自己需要进行选择,可以默认即可,点击ok。这样就把so文件添加到jnilibs的文件中,这样的话程序的代码就可以进行调用其中方法。

『柒』 android 怎么编译so文件

android NDK编译多个so文件android编译系统的makefile文件Android.mk写法如下(1)Android.mk文件首先需要指定LOCAL_PATH变量,用于查找源文件。由于一般情况下Android.mk和需要编译的源文件在同一目录下,所以定义成如下形式:LOCAL_PATH:=$(call my-dir)上面的语句的意思是将LOCAL_PATH变量定义成本文件所在目录路径。(2)Android.mk中可以定义多个编译模块,每个编译模块都是以include $(CLEAR_VARS)开始以include $(BUILD_XXX)结束。include $(CLEAR_VARS)CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除除LOCAL_PATH以外的所有LOCAL_XXX变量,如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_SHARED_LIBRARIES,LOCAL_STATIC_LIBRARIES等。include $(BUILD_STATIC_LIBRARY)表示编译成静态库include $(BUILD_SHARED_LIBRARY)表示编译成动态库。include $(BUILD_EXECUTABLE)表示编译成可执行程序(3)举例如下(frameworks/base/libs/audioflinger/Android.mk):LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS) 模块一ifeq ($(AUDIO_POLICY_TEST),true) ENABLE_AUDIO_DUMP := trueendifLOCAL_SRC_FILES:= \ AudioHardwareGeneric.cpp \ AudioHardwareStub.cpp \ AudioHardwareInterface.cppifeq ($(ENABLE_AUDIO_DUMP),true) LOCAL_SRC_FILES += AudioDumpInterface.cpp LOCAL_CFLAGS += -DENABLE_AUDIO_DUMPendifLOCAL_SHARED_LIBRARIES := \ libcutils \ libutils \ libbinder \ libmedia \ libhardware_legacyifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true) LOCAL_CFLAGS += -DGENERIC_AUDIOendifLOCAL_MODULE:= libaudiointerfaceifeq ($(BOARD_HAVE_BLUETOOTH),true) LOCAL_SRC_FILES += A2dpAudioInterface.cpp LOCAL_SHARED_LIBRARIES += liba2dp LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP LOCAL_C_INCLUDES += $(call include-path-for, bluez)endifinclude $(BUILD_STATIC_LIBRARY) 模块一编译成静态库include $(CLEAR_VARS) 模块二LOCAL_SRC_FILES:= \ AudioPolicyManagerBase.cppLOCAL_SHARED_LIBRARIES := \ libcutils \ libutils \ libmediaifeq ($(TARGET_SIMULATOR),true) LOCAL_LDLIBS += -ldlelse LOCAL_SHARED_LIBRARIES += libdlendifLOCAL_MODULE:= libaudiopolicybaseifeq ($(BOARD_HAVE_BLUETOOTH),true) LOCAL_CFLAGS += -DWITH_A2DPendififeq ($(AUDIO_POLICY_TEST),true) LOCAL_CFLAGS += -DAUDIO_POLICY_TESTendifinclude $(BUILD_STATIC_LIBRARY) 模块二编译成静态库include $(CLEAR_VARS) 模块三LOCAL_SRC_FILES:= \ AudioFlinger.cpp \ AudioMixer.cpp.arm \ AudioResampler.cpp.arm \ AudioResamplerSinc.cpp.arm \ AudioResamplerCubic.cpp.arm \ AudioPolicyService.cppLOCAL_SHARED_LIBRARIES := \ libcutils \ libutils \ libbinder \ libmedia \ libhardware_legacyifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true) LOCAL_STATIC_LIBRARIES += libaudiointerface libaudiopolicybase LOCAL_CFLAGS += -DGENERIC_AUDIOelse LOCAL_SHARED_LIBRARIES += libaudio libaudiopolicyendififeq ($(TARGET_SIMULATOR),true) LOCAL_LDLIBS += -ldlelse LOCAL_SHARED_LIBRARIES += libdlendifLOCAL_MODULE:= libaudioflingerifeq ($(BOARD_HAVE_BLUETOOTH),true) LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP LOCAL_SHARED_LIBRARIES += liba2dpendififeq ($(AUDIO_POLICY_TEST),true) LOCAL_CFLAGS += -DAUDIO_POLICY_TESTendififeq ($(TARGET_SIMULATOR),true) ifeq ($(HOST_OS),linux) LOCAL_LDLIBS += -lrt -lpthread endifendififeq ($(BOARD_USE_LVMX),true) LOCAL_CFLAGS += -DLVMX LOCAL_C_INCLUDES += vendor/nxp LOCAL_STATIC_LIBRARIES += liblifevibes LOCAL_SHARED_LIBRARIES += liblvmxservice# LOCAL_SHARED_LIBRARIES += liblvmxipcendifinclude $(BUILD_SHARED_LIBRARY) 模块三编译成动态库(4)编译一个应用程序(APK) LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Build all java files in the java subdirectory–>直译(建立在java子目录中的所有Java文件) LOCAL_SRC_FILES := $(call all-subdir-java-files) # Name of the APK to build–>直译(创建APK的名称) LOCAL_PACKAGE_NAME := LocalPackage # Tell it to build an APK–>直译(告诉它来建立一个APK) include $(BUILD_PACKAGE)(5)编译一个依赖于静态Java库(static.jar)的应用程序 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # List of static libraries to include in the package LOCAL_STATIC_JAVA_LIBRARIES := static-library # Build all java files in the java subdirectory LOCAL_SRC_FILES := $(call all-subdir-java-files) # Name of the APK to build LOCAL_PACKAGE_NAME := LocalPackage # Tell it to build an APK include $(BUILD_PACKAGE)(6)编译一个需要用平台的key签名的应用程序 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Build all java files in the java subdirectory LOCAL_SRC_FILES := $(call all-subdir-java-files) # Name of the APK to build LOCAL_PACKAGE_NAME := LocalPackage LOCAL_CERTIFICATE := platform # Tell it to build an APK include $(BUILD_PACKAGE)(7)编译一个需要用特定key前面的应用程序 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Build all java files in the java subdirectory LOCAL_SRC_FILES := $(call all-subdir-java-files) # Name of the APK to build LOCAL_PACKAGE_NAME := LocalPackage LOCAL_CERTIFICATE := vendor/example/certs/app # Tell it to build an APK include $(BUILD_PACKAGE)(8)添加一个预编译应用程序 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Mole name should match apk name to be installed. LOCAL_MODULE := LocalMoleName LOCAL_SRC_FILES := $(LOCAL_MODULE).apk LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) include $(BUILD_PREBUILT)(9)添加一个静态JAVA库 LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Build all java files in the java subdirectory LOCAL_SRC_FILES := $(call all-subdir-java-files) # Any libraries that this library depends on LOCAL_JAVA_LIBRARIES := android.test.runner # The name of the jar file to create LOCAL_MODULE := sample # Build a static jar file. include $(BUILD_STATIC_JAVA_LIBRARY)(10)Android.mk的编译模块中间可以定义相关的编译内容,也就是指定相关的变量如下:LOCAL_AAPT_FLAGSLOCAL_ACP_UNAVAILABLE LOCAL_ADDITIONAL_JAVA_DIR LOCAL_AIDL_INCLUDES LOCAL_ALLOW_UNDEFINED_SYMBOLS LOCAL_ARM_MODE LOCAL_ASFLAGS LOCAL_ASSET_DIR LOCAL_ASSET_FILES 在Android.mk文件中编译应用程序(BUILD_PACKAGE)时设置此变量,表示资源文件, 通常会定义成LOCAL_ASSET_FILES += $(call find-subdir-assets)LOCAL_BUILT_MODULE_STEM LOCAL_C_INCLUDES 额外的C/C++编译头文件路径,用LOCAL_PATH表示本文件所在目录 举例如下: LOCAL_C_INCLUDES += extlibs/zlib-1.2.3 LOCAL_C_INCLUDES += $(LOCAL_PATH)/src LOCAL_CC 指定C编译器LOCAL_CERTIFICATE 签名认证LOCAL_CFLAGS 为C/C++编译器定义额外的标志(如宏定义),举例:LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1LOCAL_CLASSPATH LOCAL_COMPRESS_MODULE_SYMBOLS LOCAL_COPY_HEADERS install应用程序时需要复制的头文件,必须同时定义LOCAL_COPY_HEADERS_TOLOCAL_COPY_HEADERS_TO install应用程序时复制头文件的目的路径LOCAL_CPP_EXTENSION 如果你的C++文件不是以cpp为文件后缀,你可以通过LOCAL_CPP_EXTENSION指定C++文件后缀名 如:LOCAL_CPP_EXTENSION := .cc 注意统一模块中C++文件后缀必须保持一致。LOCAL_CPPFLAGS 传递额外的标志给C++编译器,如:LOCAL_CPPFLAGS += -ffriend-injectionLOCAL_CXX 指定C++编译器LOCAL_DX_FLAGSLOCAL_EXPORT_PACKAGE_RESOURCESLOCAL_FORCE_STATIC_EXECUTABLE 如果编译的可执行程序要进行静态链接(执行时不依赖于任何动态库),则设置LOCAL_FORCE_STATIC_EXECUTABLE:=true 目前只有libc有静态库形式,这个只有文件系统中/sbin目录下的应用程序会用到,这个目录下的应用程序在运行时通常 文件系统的其它部分还没有加载,所以必须进行静态链接。LOCAL_GENERATED_SOURCESLOCAL_INSTRUMENTATION_FORLOCAL_INSTRUMENTATION_FOR_PACKAGE_NAMELOCAL_INTERMEDIATE_SOURCESLOCAL_INTERMEDIATE_TARGETSLOCAL_IS_HOST_MODULELOCAL_JAR_MANIFESTLOCAL_JARJAR_RULESLOCAL_JAVA_LIBRARIES 编译java应用程序和库的时候指定包含的java类库,目前有core和framework两种 多数情况下定义成:LOCAL_JAVA_LIBRARIES := core framework 注意LOCAL_JAVA_LIBRARIES不是必须的,而且编译APK时不允许定义(系统会自动添加)LOCAL_JAVA_RESOURCE_DIRS LOCAL_JAVA_RESOURCE_FILES LOCAL_JNI_SHARED_LIBRARIES LOCAL_LDFLAGS 传递额外的参数给连接器(务必注意参数的顺序)LOCAL_LDLIBS 为可执行程序或者库的编译指定额外的库,指定库以"-lxxx"格式,举例: LOCAL_LDLIBS += -lcurses -lpthread LOCAL_LDLIBS += -Wl,-z,origin LOCAL_MODULE 生成的模块的名称(注意应用程序名称用LOCAL_PACKAGE_NAME而不是LOCAL_MODULE)LOCAL_MODULE_PATH 生成模块的路径LOCAL_MODULE_STEM LOCAL_MODULE_TAGS 生成模块的标记 LOCAL_NO_DEFAULT_COMPILER_FLAGS LOCAL_NO_EMMA_COMPILE LOCAL_NO_EMMA_INSTRUMENT LOCAL_NO_STANDARD_LIBRARIES LOCAL_OVERRIDES_PACKAGES LOCAL_PACKAGE_NAME APK应用程序的名称 LOCAL_POST_PROCESS_COMMANDLOCAL_PREBUILT_EXECUTABLES 预编译including $(BUILD_PREBUILT)或者$(BUILD_HOST_PREBUILT)时所用,指定需要复制的可执行文件LOCAL_PREBUILT_JAVA_LIBRARIES LOCAL_PREBUILT_LIBS 预编译including $(BUILD_PREBUILT)或者$(BUILD_HOST_PREBUILT)时所用, 指定需要复制的库.LOCAL_PREBUILT_OBJ_FILES LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES LOCAL_PRELINK_MODULE 是否需要预连接处理(默认需要,用来做动态库优化)LOCAL_REQUIRED_MODULES 指定模块运行所依赖的模块(模块安装时将会同步安装它所依赖的模块)LOCAL_RESOURCE_DIRLOCAL_SDK_VERSIONLOCAL_SHARED_LIBRARIES 可链接动态库LOCAL_SRC_FILES 编译源文件LOCAL_STATIC_JAVA_LIBRARIES LOCAL_STATIC_LIBRARIES 可链接静态库 LOCAL_UNINSTALLABLE_MODULE LOCAL_UNSTRIPPED_PATHLOCAL_WHOLE_STATIC_LIBRARIES 指定模块所需要载入的完整静态库(这些精通库在链接是不允许链接器删除其中无用的代码)LOCAL_YACCFLAGSOVERRIDE_BUILT_MODULE_PATH

『捌』 android studio中so库文件夹放在哪

android studio 中 添加.so 文件,Android Studio中添加.jar文件和.so文件无疑是一件很重要也是很头疼的问题!

1、在src/main中添加 jniLibs文件夹 ,把.so复制进去

『玖』 android应用.so文件路径

.so文件是自动生成的,必须放在libs/armeabi目录下(不然程序绝对找不到),注意,现在一般都是libs目录了吧。

『拾』 如何加载so文件 android

android中加载so文件:

在Android中调用动态库文件(*.so)都是通过jni的方式,而且往往在apk或jar包中调用so文件时,都要将对应so文件打包进apk或jar包,工程目录下图:

Android中加载so文件的提供的API:

void System.load(String pathName);

说明:

1、pathName:文件名+文件路劲;

2、该方法调用成功后so文件中的导出函数都将插入的系统提供的一个映射表(类型Map);

3、具体代码如下:

try { String localPath = Environment.getExternalStorageDirectory() + path; Log.v(TAG, "LazyBandingLib localPath:" + localPath);

String[] tokens = mPatterns.split(path); if (null == tokens || tokens.length <= 0 || tokens[tokens.length – 1] == "") { Log.v(TAG, "非法的文件路径!"); return -3; } // 开辟一个输入流 File inFile = new File(localPath); // 判断需加载的文件是否存在 if (!inFile.exists()) { // 下载远程驱动文件 Log.v(TAG, inFile.getAbsolutePath() + " is not fond!"); return 1; } FileInputStream fis = new FileInputStream(inFile);

File dir = context.getDir("libs", Context.MODE_PRIVATE); // 获取驱动文件输出流 File soFile = new File(dir, tokens[tokens.length – 1]); if (!soFile.exists()) { Log.v(TAG, "### " + soFile.getAbsolutePath() + " is not exists"); FileOutputStream fos = new FileOutputStream(soFile); Log.v(TAG, "FileOutputStream:" + fos.toString() + ",tokens:" + tokens[tokens.length – 1]);

// 字节数组输出流,写入到内存中(ram) ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = -1; while ((len = fis.read(buffer)) != -1) { baos.write(buffer, 0, len); } // 从内存到写入到具体文件 fos.write(baos.toByteArray()); // 关闭文件流 baos.close(); fos.close(); } fis.close(); Log.v(TAG, "### System.load start"); // 加载外设驱动 System.load(soFile.getAbsolutePath()); Log.v(TAG, "### System.load End");

return 0;

} catch (Exception e) { Log.v(TAG, "Exception " + e.getMessage()); e.printStackTrace(); return -1;

}

未经允许不得转载:山九号 » androidso文件路径|如何获取android项目下某个文件的绝对路径

赞 (0)