前提・実現したいこと
現在、C言語でFILE構造体を用いてバイナリでファイルを読み込む、というのを行っていました。
発生している問題・エラーメッセージ
freadの戻り値が 0 になる
該当のソースコード
C
1#include <stdio.h> 2 3#include "jni.h" 4 5#include "JylBinaryFile.h" 6 7// ファイルを示す構造体を用意 8FILE* fp; 9 10JNIEXPORT void JNICALL Java_org_jyl_base_io_JylBinaryFile_nopen( JNIEnv *env, jobject obj, jstring path ) 11{ 12 // 文字列を用意 13 const char* fpath = (*env)->GetStringUTFChars( env, path, 0 ); 14 15 // ファイルを開く 16 fp = fopen( fpath, "rb" ); 17 18 if( NULL == fp ){ 19 // IOException のクラスを取得 20 jclass thcls = (*env)->FindClass( env, "java/io/IOException" ); 21 // 例外をスロー 22 (*env)->ThrowNew( env, thcls, "" ); 23 } 24 25 // 文字列を開放 26 (*env)->ReleaseStringUTFChars( env, path, fpath ); 27} 28 29JNIEXPORT jbyte JNICALL Java_org_jyl_base_io_JylBinaryFile_nread__( JNIEnv *env, jobject obj ) 30{ 31 // 読み込み後データを入れるバイト 32 char readdata; 33 34 // バイトを読み込めなかった場合 35 if( fread( (void*)&readdata, sizeof( char ), 1, fp ) < 1 ){ 36 // エラー発生なのでファイルを閉じる 37 fclose( fp ); 38 // IOException のクラスを取得 39 jclass thcls = (*env)->FindClass( env, "java/io/IOException" ); 40 // 例外をスロー 41 (*env)->ThrowNew( env, thcls, "" ); 42 } 43 44// fread( &readdata, sizeof( char ), 1, fp ); 45 46 jbyte jdata = readdata; 47 48 return jdata; 49} 50
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class org_jyl_base_io_JylBinaryFile */ #ifndef _Included_org_jyl_base_io_JylBinaryFile #define _Included_org_jyl_base_io_JylBinaryFile #ifdef __cplusplus extern "C" { #endif /* * Class: org_jyl_base_io_JylBinaryFile * Method: nopen * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_org_jyl_base_io_JylBinaryFile_nopen (JNIEnv *, jobject, jstring); /* * Class: org_jyl_base_io_JylBinaryFile * Method: nread * Signature: ()B */ JNIEXPORT jbyte JNICALL Java_org_jyl_base_io_JylBinaryFile_nread__ (JNIEnv *, jobject); /* * Class: org_jyl_base_io_JylBinaryFile * Method: nread * Signature: (II)B */ JNIEXPORT jbyte JNICALL Java_org_jyl_base_io_JylBinaryFile_nread__II (JNIEnv *, jobject, jint, jint); #ifdef __cplusplus } #endif #endif
試したこと
ファイルが開けていることをnopen実行時例外が出なかったことにより確認
補足情報(FW/ツールのバージョンなど)
linux( Raspberry pi )を使用しています。
gcc のバージョンは 6.3.0 です。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/24 12:10