Java JNI иногда с правильным результатом иногда нет - PullRequest
1 голос
/ 04 ноября 2011

У меня есть структура в C, которая сохраняет строки, что-то вроде словаря (не сохраняет строки, у которых есть подстроки в словаре) ... Теперь я хочу вызвать функцию, разработанную в C из Java. Я создаю «интерфейсный» JNI для вызова функции C в Java, и это работает почти идеально.

Например, в 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' добавлено" , иногда печатает "'some' добавлено" и " Правильный результат - только для печати "'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();
        }
    }
}

DicJNI.java

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_dic_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

org_dic_DicJNI.c

#include "org_dic_DicJNI.h"
#include "dic.h"

#define false   0
#define true    1

dic d = NULL;

JNIEXPORT jboolean JNICALL Java_org_dic_DicJNI_createDic
  (JNIEnv *env, jobject obj)
{
    d = dic_new();

    if (d == NULL)  return false;
    else            return true;
}

JNIEXPORT void JNICALL Java_org_dic_DicJNI_deleteDic
  (JNIEnv *env, jobject obj)
{
    dic_free(d);
}

JNIEXPORT jboolean JNICALL Java_org_dic_DicJNI_searchDic
  (JNIEnv *env, jobject obj, jstring s)
{
    if (!dic_search(d, s)) {
        return false;   // Not Found
    }
    else {
        return true;    // Found
    }
}

JNIEXPORT void JNICALL Java_org_dic_DicJNI_insertDic
  (JNIEnv *env, jobject obj, jstring s)
{
    dic_add(d, s);
}

int main() { return 0; }

При этом иногда у меня есть только "некоторые добавлены!" а иногда "некоторые добавлены!" и "что-то добавлено!", я не могу понять, почему это произошло! (

1 Ответ

2 голосов
/ 04 ноября 2011

Это лучший способ написать это:

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");
}

После перечитывания я согласен с G_H, возможно, стоит проверить еще раз dic.find ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...