Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.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
C中的fprintf()在通过Java本机接口调用时生成垃圾文件名_Java_C_Java Native Interface - Fatal编程技术网

C中的fprintf()在通过Java本机接口调用时生成垃圾文件名

C中的fprintf()在通过Java本机接口调用时生成垃圾文件名,java,c,java-native-interface,Java,C,Java Native Interface,我正在做一个Java程序,它通过JNI调用一些C函数。我有一种情况,我收集了一堆C语言的计算机能量读数,并想把它们写入一个文件。理想情况下,我希望使用fprintf(),而不是将所有数据格式化为字符串,通过JNI接口将其传递给Java,然后以Java方式将其写入文件,但这似乎效率要低得多 唯一的问题是,当我在C中执行fprintf()时,我得到的输出文件有一个垃圾名称。绝对不是我提供的文件名 alejandro@alejandro-ThinkPad-E15:~/throwawayfiles$ l

我正在做一个Java程序,它通过JNI调用一些C函数。我有一种情况,我收集了一堆C语言的计算机能量读数,并想把它们写入一个文件。理想情况下,我希望使用
fprintf()
,而不是将所有数据格式化为字符串,通过JNI接口将其传递给Java,然后以Java方式将其写入文件,但这似乎效率要低得多

唯一的问题是,当我在C中执行
fprintf()
时,我得到的输出文件有一个垃圾名称。绝对不是我提供的文件名

alejandro@alejandro-ThinkPad-E15:~/throwawayfiles$ ls
''$'\360\210\025\032\a'
不过,文件的内容是我所期望的。我也在C中调用了这个函数,它工作得很好,唯一的问题是当我方便地从Java程序调用它时。是否有一种方法可以确保输出文件具有我真正想要的名称?或者这只是我必须处理的JNI问题之一。正如我所说,计划B是将所有数据放在一个字符串中,发送到java,然后从那里进行文件写入,但这很慢,而且我不想编写代码:)

谢谢大家!

用于写入文件的代码。我正在处理一个数据结构AsyncEnergyMonitor,它收集能量读数。所有的读取和数据存储都是用C语言完成的,但是在Java程序的更大上下文中,这些都很方便

private native static void writeToFileFromC(String filePath);

public void writeToFile(String filePath)
{
    writeToFileFromC(filePath);
}
这里是文件最初打开的地方,我在标题行中写入

void writeToFile(AsyncEnergyMonitor *monitor, const char* filepath){
    FILE * outfile = (filepath) ? fopen(filepath,"w") : stdout;

    fprintf(outfile,"samplingRate: %d milliseconds\n",monitor->samplingRate);
    fprintf(outfile,"socket,dram,gpu,core,pkg,timestamp(usec since epoch)\n");
        
    if (USING_DYNAMIC_ARRAY)
        writeToFile_DynamicArray(outfile, monitor->samples_dynarr);
    if (USING_LINKED_LIST)
        writeToFile_LinkedList(outfile, monitor->samples_linklist);

    if (filepath) fclose(outfile);
}
下面是我用来写入其余数据的两个函数,这取决于数据是存储在链表中还是存储在动态数组中

void
writeToFile_DynamicArray(FILE* outfile, DynamicArray* a) {
    for (int i = 0; i < a->nItems; i++) {
        EnergyStats current = a->items[i];
        char csv_string[512];
        energy_stats_csv_string(current, csv_string);
        fprintf(outfile,"%s\n",csv_string);
    }   
}
void
writeToFile_LinkedList(FILE* outfile, LinkedList* l) {
    LinkNode* current = l->head;
    while(current != NULL) {
        int upperbound = (current == l->tail) ?
            (l->nItemsAtTail) : (NODE_CAPACITY);
        for (int i = 0; i < upperbound; i++) {
            char ener_string[512];
            energy_stats_csv_string(current->items[i], ener_string);
            fprintf(outfile,"%s\n",ener_string);
        }
        current = current->next;
    }   
}

void
writeToFile_DynamicArray(文件*outfile,DynamicArray*a){
对于(int i=0;inItems;i++){
EnergyStats current=a->items[i];
字符csv_字符串[512];
能源统计数据csv字符串(当前,csv字符串);
fprintf(输出文件,“%s\n”,csv\u字符串);
}   
}
无效的
writeToFile_LinkedList(文件*outfile,LinkedList*l){
链接节点*当前=l->head;
while(当前!=NULL){
int上限=(当前==l->tail)?
(l->nItemsAtTail):(节点容量);
for(int i=0;i项目[i],能量字符串);
fprintf(输出文件,“%s\n”,ener\u字符串);
}
当前=当前->下一步;
}   
}

我忘了显式地将文件路径名从Java字符串转换为C字符串。与从C编写文件无关。只是创建了一个垃圾字符串名称,因为我没有转换

JNIEXPORT void JNICALL
Java_jrapl_AsyncEnergyMonitorCSide_writeToFileFromC(JNIEnv* env,
  jclass jcls, const char* filepath)
{
    writeToFile(monitor, filepath);
}
固定到

JNIEXPORT void JNICALL
Java_jrapl_AsyncEnergyMonitorCSide_writeToFileFromC(JNIEnv* env, jclass jcls, 
  jstring jstringFilepath)
{
    const char* filepath = (*env)->GetStringUTFChars(env, jstringFilepath, NULL);
    writeToFile(monitor, filepath);
    (*env)->ReleaseStringUTFChars(env, jstringFilepath, filepath);
}

现在一切都好了。

如果您显示了用于打开文件的代码,它会很有帮助。
Java\u jrapl\u AsyncEnergyMonitorSide\u writeToFileFromC(JNIEnv*env,jclass jcls,const char*filepath)
?!?!?!您从哪里得到一个JNI函数,您认为它将传递一个可以直接在C代码中使用的
const char*
JNIEXPORT void JNICALL
Java_jrapl_AsyncEnergyMonitorCSide_writeToFileFromC(JNIEnv* env, jclass jcls, 
  jstring jstringFilepath)
{
    const char* filepath = (*env)->GetStringUTFChars(env, jstringFilepath, NULL);
    writeToFile(monitor, filepath);
    (*env)->ReleaseStringUTFChars(env, jstringFilepath, filepath);
}