Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-在本机和java应用程序之间使用管道_Java_Android_Pipe_Native Code - Fatal编程技术网

Android-在本机和java应用程序之间使用管道

Android-在本机和java应用程序之间使用管道,java,android,pipe,native-code,Java,Android,Pipe,Native Code,我正在开发SGS2 api v.16 我有两个应用程序:原生和Java 在本机应用程序中,我使用mkfifo()函数打开一个Unix管道,并向其中写入一些字符串 在java应用程序中,我试图读取字符串,但不知怎的,应用程序阻塞了,我没有 知道原因,日志中没有显示其阻塞的原因 这两个应用程序的清单中都有android:sharedUserId=“my.Id”,共享确实有效 在logcat中,我可以看到“打开输入流”日志,但之后没有日志。。 在Java中,有没有推荐的读取管道文件的方法? 注意:如果

我正在开发SGS2 api v.16

我有两个应用程序:原生和Java

在本机应用程序中,我使用mkfifo()函数打开一个Unix管道,并向其中写入一些字符串

在java应用程序中,我试图读取字符串,但不知怎的,应用程序阻塞了,我没有 知道原因,日志中没有显示其阻塞的原因

这两个应用程序的清单中都有android:sharedUserId=“my.Id”,共享确实有效

在logcat中,我可以看到“打开输入流”日志,但之后没有日志。。 在Java中,有没有推荐的读取管道文件的方法? 注意:如果我使用open(…)而不是使用mkfifo(…)打开一个常规文件,我成功地读取了该文件,那么问题只出现在我使用mkfifo()打开管道文件时。

以下是从本机应用程序运行的函数:

jint Java_com_example_ndkfoo_NdkFooActivity_writeToPipe(JNIEnv* env, jobject javaThis) {
   const char* PATH = "/data/data/com.example.ndkfoo/v_pipe8";
   char* line = "Hello Pipe!";
   int pipe;
   errno = 0;

   // open a named pipe
   mode_t mode = S_IRWXU | S_IRWXG | S_IRWXO;
   pipe = mkfifo(PATH, mode);
   if(errno != 0) {
        __android_log_write(ANDROID_LOG_ERROR, "NDK_FOO_TAG", strerror(errno));
        return errno;
    }
    __android_log_write(ANDROID_LOG_DEBUG, "NDK_FOO_TAG", "file opened successfully");

   // actually write out the data and close the pipe
   int err = write(pipe, line, strlen(line));

    // close the pipe
   close(pipe);
   return err;

}
下面是尝试从管道读取数据的java

package com.example.secondparty;

import java.io.FileDescriptor;
import java.io.FileInputStream;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;

public class MainActivity extends Activity {
     private static final String TAG = MainActivity.class.getSimpleName();
     //public final static String PATH2 = "/sdcard/fifo9001";
     public final static String PATH = "/data/data/com.example.ndkfoo/v_pipe8";

     @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        readFromPipe();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    private void readFromPipe() {
        Log.i(TAG, "Attempt started");
        FileInputStream fis;
        String message = "";
        byte buffer[] = new byte[256];

        try {
            Log.i(TAG, "openning input stream");
            fis = new FileInputStream(PATH);
            Log.i(TAG, "input stream opened");
            FileDescriptor fd =  fis.getFD();
            int len = 0;
            do {
                len = fis.read(buffer);
                if(len > 0) {
                    String newmessage = new String(buffer,0, len, "US-ASCII");
                    message += newmessage;
                }
            } while (len == buffer.length);
            Log.i(TAG, "message: "+message);
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }


    }
}

使用BufferedReader代替`FileInputStream

这里是对该案例非常有用的考虑,并附有一些示例和解释

我假设它会阻塞do..while循环?请不要将链接作为答案发布。如果超时,链接可能会断开。请在你的答案中包括所有细节。另外,请记住,这个问题已经有了一个公认的答案。我试过了,但总是在BufferedReader中等待。