2016-07-14 2 views
1

У меня есть часть кода, которая написана для записи в трубу из собственного кода в Android. Однако программа, похоже, не блокирует операцию записи. Как я понимаю, программа должна блокировать запись до тех пор, пока не будет процесс, который, наконец, будет читаться из трубы. Пожалуйста, дайте мне знать, что не так с приведенным ниже кодом, и почему он выходит без блокировки.Проблема с трубкой в ​​Android

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <string.h> 
#include <unistd.h> 

int main() 
{ 
    const char* PATH = "/data/data/com.endpoint.login/v_pipe8"; 
    char* line = "Hello Pipe!"; 
    int pipe; 

    mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO; 
    pipe = mkfifo(PATH, mode); 
    if (pipe == -1) 
    { 
     printf("mkfifo failure\n"); 
    } 

    sleep(1); 
    int err = write(pipe,line,strlen(line)); 

    if (err == -1) 
    { 
      printf("write error in the pipe\n"); 
    } 

    close(pipe); 
    return 0; 
} 

ответ

0

Доступ к прямому пути к памяти на Android невозможен (возможно, устройство укоренено). Итак, вам нужен путь, предоставляемый Android SDK. В Java создайте канал, следующий за its reference, используйте NDK для отправки объекта на C и используйте его как BufferedReader.

Если у вас нет части Java, потому что это приложение с естественным родным, вы можете создать его непосредственно на C, но это немного сложно. Вам понадобятся JNI reference и JNI Functions.

+0

Мне нужно разделить трубку между Java и собственным процессом. Я не понял часть JNI, о которой вы говорили. Если путь трубы известен уже между Java и Native процессом, возможно, они разделяют канал? –

+0

Чтобы поделиться, вам нужно вызвать C из Java с помощью функции, например: «jint Java_JAVAPACKAGE_writeToPipe (JNIEnv * env, jobject jObject)». Вам нужно узнать кое-что о JNI, чтобы сделать это должным образом. У вас есть пример в других вопросах, также жестко запрограммированных. http://stackoverflow.com/questions/12844418/android-using-pipe-between-native-and-java-apps – vgonisanz

1

Я нашел ответ. Проблема, которую программа не блокировала, была ошибкой в ​​программе.

Эта программа не открывалась перед вызовом записи. Также mkfifo не возвращает fd для трубы. Правильный ответ следующий:

#include <stdio.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/stat.h> 
#include <string.h> 
#include <unistd.h> 
#include <fcntl.h> 

int main() 
{ 
    const char* PATH = "/data/data/com.endpoint.login/v_pipe8"; 
    char* line = "Hello Pipe!"; 
    int pipe, status; 

    mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO; 
    status = mkfifo(PATH, mode); 
    if (status == -1) 
    { 
     printf("mkfifo failure\n"); 
    } 

    pipe = open(PATH,O_WRONLY); 
    sleep(1); 
    int err = write(pipe,line,strlen(line)); 

    if (err == -1) 
    { 
      printf("write error in the pipe\n"); 
    } 

    close(pipe); 
    return 0; 
} 
Смежные вопросы