에뮬레이터 내부의 files 디렉토리에 파일을 생성해 놓으면 일반적인 안드로이드 app의 경우 정상적으로 읽기 쓰기가 가능했습니다.
하지만 디바이스를 건드려야 하는 프로젝트를 진행중이라 jni를 이용해 c에서는 장치파일을 접근하고 안드로이드 어플이
이를 컨트롤하도록 하려 합니다. 이경우 파일을 어디에 위치시켜야 읽기쓰기가 가능할까요?
아래는 소스 입니다. hello-jni 예제에서 c 파일만 약간 수정한 것입니다.
/* c 소스파일 */
17 #include <string.h>
18 #include <jni.h>
19 #include <sys/types.h>
20 #include <sys/stat.h>
21 #include <fcntl.h>
22
30 jstring
31 Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
32 jobject thiz )
33 {
34 int fd;
35 char temp[10];
36 memset(temp, 0, 10);
37 fd = open("input.txt", O_RDONLY);
38 read(fd, temp, 9);
39 temp[10] = 0;
40 close(fd);
41 return (*env)->NewStringUTF(env, temp);
42 }
input.txt 파일에서 데이터를 읽어 temp 배열에 저장해 NewStringUTF를 호출하는 아주 단순한 소스입니다.
문제는 open이 0을 리턴합니다. 즉 open조차 안되고 있습니다. 아마 files 가 아닌 다른 디렉토리거나 권한 문제일 것으로 생각됩니다.
/* java 소스파일 */
29 public class HelloJni extends Activity
30 {
31 /** Called when the activity is first created. */
32 @Override
33 public void onCreate(Bundle savedInstanceState)
34 {
35 super.onCreate(savedInstanceState);
36
37 /* Create a TextView and set its content.
38 * the text is retrieved by calling a native
39 * function.
40 */
41 TextView tv = new TextView(this);
42 tv.setText( stringFromJNI() );
43 setContentView(tv);
44 }
84 public native String stringFromJNI();
96 public native String unimplementedStringFromJNI();
97
103 static {
104 System.loadLibrary("hello-jni");
105 }
106 }
이것은 java 소스로 수정하지 않았습니다. jni 에서는 파일의 엑세스 위치가 어떻게 되나요??
하지만 한가지 더 문제점이 생겼습니다. 장치파일 (/dev 내부의 파일들)을 접근해야되는데
오픈시 에러가 발생합니다. 이렇게 시스템콜로 장치파일에 직접 접근은 힘든건가요? jni 라이브러리를 사용해 접근해야 하나요?




장치파일을 엑세스 하시려면 system 정도의 권한이 필요하실 것으로 보입니다.
제조사와 컨텍이 가능하시다면 AndroidManifest.xml에 android:sharedUserId="android.uid.system" 를 추가하시고
system key로 apk를 sign하시면 디바이스 파일에 엑세스가 되실 겁니다.
단순히 sdcard만 엑세스 하심 되신다면 /sdcard/input.txt 와 같이 경로를 주시고 AndroidManifest.xml 에
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>를 넣어주심 됩니다.