2015-02-02 2 views
3

Android 5.0에서 selinux (SE Linux)의 허용 및 적용 메커니즘을 확인하고 있습니다. .so 파일을 /data/data/packageName/files/libtestcalc.so에 넣었습니다.경로에서 Android로드 라이브러리

장치가 허용 모드 인 경우 System.load ("/ data/data/packageName/files/libtestcalc.so"); - 잘 작동하고 예외가없는 .so 파일의 메서드에 액세스 할 수 있습니다.

동일한 System.load ("/ data/data/packageName/files/libtestcalc.so"); 장치가 강제 모드에있을 때 작동하지 않고 다음과 같이 예외가 발생합니다.

에서 java.lang.UnsatisfiedLinkError : "/data/data/packageName/files/libtestcalc.so"1 세그먼트 매핑 할 수 있습니다 : 권한이

내가 모드 모두에서 추측을 부인을, 같은 호출 흐름 실패를한다면 dlopen 일어날 것이다. System.load (..) -> Runtime.getRuntime(). load (..) -> Runtime.getRuntime (..). doload (..) -> Runtime.getRuntime(). nativeLoad (..)를 의미합니다.)

는 "nativeLoad 동기화해야합니다 그래서 ...에 관계없이 사용 하나 LD_LIBRARY_PATH있다"로 @ Runtime.java-> doLoad (..) 문서가이 LD_LIBRARY_PATH이 업데이 트됩니다 때

언급?

android가 모드별로로드 파일을 차별화하는 방법은 무엇입니까? "/ data/data/packageName/files /"에서 .so 파일을로드하는 다른 방법을 알고 싶습니다.

+0

이 문제에 대한 해결책이 있습니까? –

답변

0

파일을 앱의 개인 내부 저장소 폴더 아래 원하는 위치로 복사하고, 읽기 전용이며 실행 가능으로 표시되어 있는지 확인하십시오 (특히 누구에게도 쓰기 권한이 없음). 이것은 실행 파일이 허용되는 응용 프로그램에서 일반적으로 쓸 수있는 위치의 유일한 트리입니다.

초기화 된 활동 또는 서비스 컨텍스트에서 getFilesDir()을 호출하여 개인 폴더 위치를 확인할 수 있습니다.

Java에서 파일을 복사하는 메커니즘을 설명하는 많은 기존 질문이 있습니다.

+1

답변의 출처도 언급하는 것이 좋습니다. 나는 1 년 전에 답한 것과 똑같은 또 다른 대답을 발견했습니다. – userv

관련 문제