Java JNI有时结果正确有时结果不正确

Java JNI有时结果正确有时结果不正确,java,java-native-interface,Java,Java Native Interface,我有一个保存字符串的C结构,类似于字典(不保存字典中有子字符串的字符串)。。。 现在我想从Java调用用C开发的函数。我创建了“接口”JNI来调用Java中的C函数,这几乎可以完美地工作 例如,在Java中,我有: Dictionary dic = new Dictionary(); if (dic.find("some") == false) { dic.add("some"); System.out.println("'some' added"); } if (dic.fin

我有一个保存字符串的C结构,类似于字典(不保存字典中有子字符串的字符串)。。。 现在我想从Java调用用C开发的函数。我创建了“接口”JNI来调用Java中的C函数,这几乎可以完美地工作

例如,在Java中,我有:

Dictionary dic = new Dictionary();
if (dic.find("some") == false) {
    dic.add("some");
    System.out.println("'some' added");
}
if (dic.find("something") == false) {
    dic.add("something");
    System.out.println("'something' added");
}
有时我的程序只打印“'some'added”,有时打印“'some'added”“'something'added”。。。正确的结果是只打印“'some'添加”,因为第二个单词有子字符串'some',所以第二个单词不应该插入到听写中

为什么会这样?!为什么程序有时返回正确的结果,有时返回不正确的结果


--更新-- Example.java

public class Example
{
    public static void main(String[] args)
    {
        for (int i = 0; i < 1000; i++) // why 1000? To test the resistance of the JNI implementation
        {
            DicJNI dicJNI = new dicJNI();
            dicJNI.create();

            if (!dicJNI.search("some")) {
                dicJNI.insert("some");
                System.out.println("some added!");
            }
            if (!dicJNI.search("something")) {
                dicJNI.insert("something");
                System.out.println("something added!");
            }

            dicJNI.delete();
        }
    }
}
public class DicJNI
{
    public native boolean   createDic();
    public native void      deleteDic();
    public native boolean   searchDic(String s);
    public native void      insertDic(String s);

    static {
        System.loadLibrary("DicJNI_linux_x86_64");
    }

    private DicJNI dicJNI;

    public boolean create() {
        dicJNI = new DicJNI();
        return dicJNI.createDic();
    }

    public void delete() {
        dicJNI.deleteDic();
    }

    public boolean search(String s) {
        return dicJNI.searchDic(s);
    }

    public void insert(String s) {
        dicJNI.insertDic(s);
    }
}
org\u dic\u DicJNI.h

#include <jni.h>

#ifndef _Included_org_dic_DicJNI
#define _Included_org_dic_DicJNI
#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jboolean JNICALL Java_org_dic_DicJNI_createDic
  (JNIEnv *, jobject);

JNIEXPORT void JNICALL Java_org_dic_DicJNI_deleteDic
  (JNIEnv *, jobject);

JNIEXPORT jboolean JNICALL Java_org_dic_DicJNI_searchDic
  (JNIEnv *, jobject, jstring);

JNIEXPORT void JNICALL Java_org_dic_DicJNI_insertDic
  (JNIEnv *, jobject, jstring);

JNIEXPORT void JNICALL Java_org_Dic_DicJNI_XDic
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

有鉴于此,有时我只有“添加了一些!”和“添加了一些!”以及“添加了一些!”,我无法理解为什么会发生这种情况(

这是一种更好的写作方式:

Dictionary dic = new Dictionary();
if (!dic.find("some")) {
    dic.add("Porto");
    System.out.println("'some' added");
}
if (!dic.find("something")) {
    dic.add("Porto");
    System.out.println("'something' added");
}

在重读之后,我同意w/G_H,可能想再次检查dic.find()。

dic.find方法的实现应该会显示答案。我们必须跟踪dic.find(“某物”)为假的原因。我用我的代码的真实示例更新了第一篇文章…即使更新了,我们也不能确定dic_搜索(d,s)我想我可以解决这个问题。在dic_搜索中,我将malloc改为calloc!显然现在它工作正常了…:)我对C代码有99.9%的信心,因为它有很多测试。。。如果(false==false)怎么会发生?是的,做
==false
==True
不是一种好的方式,但在他的情况下,我认为他想做一些关于false而不是True的事情。所以,即使是不可靠的代码,它也应该工作,或者至少给出一致的结果。
Dictionary的实际实现一定有问题。find
@zecapistolas表达式
false==false
总是正确的。因此,如果
find
返回false(即未找到,假设方法的名称可以信任),则
if
语句中的表达式将为true,代码块将执行。这就是你想要的吗?无论如何,您应该使用
if(dic.find(…)
if(!dic.find(…)
,这取决于您希望发生什么。@zmf哈哈哈,我想我们陷入了编辑循环:D
Dictionary dic = new Dictionary();
if (!dic.find("some")) {
    dic.add("Porto");
    System.out.println("'some' added");
}
if (!dic.find("something")) {
    dic.add("Porto");
    System.out.println("'something' added");
}