【问题标题】:Crashing when reading a file through JNI but successful when running just the C element of code通过 JNI 读取文件时崩溃,但仅在运行代码的 C 元素时成功
【发布时间】:2016-08-22 03:59:08
【问题描述】:

我有一个包含 java 代码的程序,然后是使用 JNI 接口的 C 代码,我要完成的任务是用 C 源文件替换一些 java 文件,然后使用 JNI 来实现相同的目的程序,但包含 C 文件。因此我知道Java代码没有问题。在源文件中,我有一个名为 readMap() 的函数,它导致了这个问题。

我已经设法将问题缩小到 C 代码由于某种原因无法读取映射的事实,通过 JNI 调用函数时执行以下 if 语句:

if(in = fopen("../maps/example_map.txt", "r") == NULL)
        {
           printf("Error opening file\n");
           exit(-1);
        }

但是,如果我仅从 MainTest.c 中的 main() 运行 C 代码,则该函数将在映射中正常读取,并且所有 C 代码都将起作用,因此我排除了类路径错误的可能性。

我还缩小了 JNI 本身的范围,因为其他函数将能够被调用并在调用时返回所需的结果,但如果调用 readMap() 则它将不起作用。

基本上我想知道是否有其他人遇到过类似的问题以及他们的解决方法是什么,或者是否有人对可能的问题有任何想法?

【问题讨论】:

  • 您需要了解operator precedence,因为表达式in = fopen(...) == NULL 并没有您认为的那样。
  • 你确定这两种情况下的工作目录是一样的吗?尝试使用绝对路径。
  • why if(in = fopen("../maps/example_map.txt", "r") == NULL)bad 代码的完美示例。至少在两行中做到这一点:FILE *in = fopen(...); if ( in == NULL )...,并且没有方法会犯这个错误。

标签: java c file input java-native-interface


【解决方案1】:

如果其他人遇到此问题,它无法正常工作的原因在于类路径,类路径是相对的,因此它来自 C 文件所在的位置,但它需要来自主 java 文件所在的位置是执行代码的位置。

我将 Java 代码保存在一个文件中,其中包含两个文件,一个用于映射,另一个用于 jni(C 代码),因此使 C 工作的路径是“../maps/example_map.txt”,而用于 java代码必须是“maps/example_map.txt”。

如果其他人遇到这个问题,请不要考虑它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多