3

私はSGS2apiv.16で開発しています

ネイティブとJavaの2つのアプリケーションがあります

ネイティブアプリから、mkfifo()関数を使用してUnixパイプを開き、それに文字列を書き込みます。

そして、Javaアプリで文字列を読み取ろうとしていますが、どういうわけかアプリがブロックされ、その理由がわかりません。ログキャットにブロックされた理由が示されていません。

2つのアプリのマニフェストにはandroid:sharedUserId = "my.Id"があり、共有は確実に機能しました。

logcatには、「入力ストリームを開いています」ログが表示されますが、その後はログが表示されません。Javaでパイプファイルから読み取るための推奨される方法はありますか? 注:mkfifo(...)を使用する代わりにopen(...)で通常のファイルを開くと、ファイルからの読み取りに成功します。問題は、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();
        }


    }
}
4

2 に答える 2

1

BufferedReader代わりに`FileInputStreamを使用してください

于 2012-12-02T17:39:56.753 に答える
0

ここでは、いくつかの例と説明とともに、このケースに関する非常に役立つ考察を示します。http://www.jonathanbeard.io/tutorials/CtoJava

于 2017-03-21T09:42:37.170 に答える