2012-05-07 1 views
1

Я принял код кода FM-кода Aurora и слился с моей кодовой базой Android Gingerbread.Android: невозможно открыть файл устройства в JNI implementationaion

Структура приложения FM пытается получить доступ к радиоустройству fm (/ dev/radio) с использованием JNI, который реализован в файле по имени android_hardware_fm.cpp. В этом файле есть функция, которая пытается получить дескриптор файла на узле устройства с помощью функции open() в режиме чтения/записи. Однако вызов завершился с кодом ошибки -13: Permission denied.

Я также сделал небольшой исполняемый файл C, который пытается открыть файл/dev/radio (в режиме RDWR), печатает его fd и закрывает его. Он запускается из/system/bin в целевой системе и отображает действительный fd.

Btw, реализация JNI является частью библиотеки ядра Android. Он расположен в рамках/base/core/jni и составлен как часть libandroid_runtime.so

Любые идеи/решения? Заранее спасибо.

+0

4 года спустя у меня действительно похожая проблема: http://stackoverflow.com/questions/37486349 Я даже запускал свой исполняемый файл как тот же UID, что и приложение, и он работает, и, конечно же, все ответ ниже. Вы когда-нибудь находили решение? – jkoreska

+0

@jkoreska Я думаю, я использовал обходное решение. см. мой комментарий в ответе ниже. – trans1st0r

ответ

1

У вас нет прав на открытие устройства из пользовательского пространства. Во втором случае, когда вы запускаете исполняемый файл с терминала, у вас есть разрешения, вероятно, потому, что вы выполнили su перед запуском исполняемого файла.

Для вашей проблемы здесь можно сделать две вещи.

1) Изменение разрешений узла от terimnal.

Шаги, которые:

  • Откройте терминал (adb shell)

  • ли su (Для того, чтобы сделать это устройство должно быть укоренены)

  • ли chmod 777 /dev/radio в терминал

Как только это будет сделано, ваш радиоузел имеет надлежащие разрешения для чтения и записи пользователем. Итак, теперь вы можете позвонить open() и он будет работать.

2) Программным вы можете добиться этого (при условии, что устройство коренится и су работает на вашем устройстве), вызвав функцию ниже - changePerm(). Это небольшая функция, которую я написал, которая изменит разрешения узлов устройства или, скорее, любой системный файл, который не имеет доступа пользователя. Когда у вас есть разрешения, вы можете открыть его из пользовательского пространства. После этого функция open() будет работать правильно.

void changePerm() 
{ 
    Process chperm; 
    try { 
     chperm=Runtime.getRuntime().exec("su"); 


    DataOutputStream os = 
      new DataOutputStream(chperm.getOutputStream()); 
     os.writeBytes("chmod 777 /dev/radio\n"); 
     os.flush(); 

     os.writeBytes("exit\n"); 
     os.flush(); 

      chperm.waitFor(); 

} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (InterruptedException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
} 

Я тестировал это для других узлов. Поэтому он также должен работать и на радио. Дайте мне знать, если вы столкнулись с трудностями. Спасибо

+0

У одного использующего adb оболочки есть разрешение на использование по умолчанию.То, что я сделал после того, как вы предложили, поместил команду «chmod 777/dev/radio0» в init.rc ... Это, однако, временное исправление. – trans1st0r

+0

для того, чтобы изменения в init.rc вступили в силу, вам необходимо перекомпилировать андроид и falash его –

+0

О, в этом случае, если у вас есть права на root по умолчанию, su может не присутствовать на вашем устройстве. Тогда применим только 1-й метод (без su) –