2016-07-14 6 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 referenceJNI Functionsが必要です。

+0

Javaとネイティブプロセスの間でパイプを共有する必要があります。あなたが言及したJNIの部分を理解できませんでした。パイプのパスが既にJavaとネイティブプロセスの間にある場合、それらはパイプを共有しませんか? –

+0

共有するには、 "jint Java_JAVAPACKAGE_writeToPipe(JNIEnv * env、jobject jObject)"のような関数でJavaからCを呼び出す必要があります。 JNIについては、有益なことをするために何かを学ぶ必要があります。他の質問にも例があり、ハードコーディングされています。 http://stackoverflow.com/questions/12844418/android-using-pipe-between-native-and-java-apps – vgonisanz

1

回答が見つかりました。プログラムがブロックされていない問題は、プログラムのエラーでした。

このプログラムは、writeを呼び出す前に開いていませんでした。また、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; 
}