从android的obb文件夹中加载.so本机库

时间:2015-05-14 15:17:26

标签: android android-permissions apk-expansion-files nativelibrary

我有一个.so文件,我打包成一个obb扩展。它大约20兆字节。

我试图使用

parameter (m=10**5,nchar=2000,ncols=110)
character (LEN=*), PARAMETER :: FORM = "(A)"
character(LEN=:),DIMENSION(:),allocatable :: data
integer j
character(LEN=100000) :: temp

* determine the length of the data
nlines = 0
j = 0
do while (ios == 0)
   read(12,FORM,end=10,iostat=ios) temp
   if (LEN(TRIM(temp)) .gt. j) THEN
      j = LEN(TRIM(temp))
   end if
   nlines = nlines+1
end do
nlines = nlines+1

10  REWIND(unit = 12)
ALLOCATE (character(LEN=j) :: data(nlines))

* read in the data
do i = 1,nlines
   read(12,FORM) data(i)
end do

加载库。但是我得到了错误:

  

dlopen(" /storage/emulated/0/Android/obb/com.mypackage.myapp/libtest.so",RTLD_LAZY)失败:dlopen失败:无法映射" /storage/emulated/0/Android/obb/com.mypackage.myapp/libtest.so"第2部分:许可被拒绝

     

type = 1400 audit(0.0:8):avc:拒绝{execute} for path =" /storage/emulated/0/Android/obb/com.mypackage.myapp/libtest.so" dev的="保险丝" ino = 367663176224 scontext = u:r:untrusted_app:s0 tcontext = u:object_r:fuse:s0 tclass = file permissive = 0

所以我意识到我们不允许在那里有可执行文件。

所以我的问题是,

1-哪里应该提取文件才能这样做?

2-我应该拨打什么函数?

谢谢。

1 个答案:

答案 0 :(得分:1)

将文件复制到您选择的应用程序专用内部存储文件夹下的任何位置,确保将其标记为只读且可执行(不可写,尤其是其他任何人!)。这是唯一一个可以由允许执行的应用程序写入的位置树。

您可以通过在初始化的活动或服务上下文上调用getFilesDir()来确定私人文件夹位置。

这里有许多问题证明了用Java进行文件复制的机制。