gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 04:57:44 25 4
gpt4 key购买 nike

我在 C 中有一个结构,可以保存字符串,类似于字典(不保存字典中具有子字符串的字符串)...现在我想从Java中调用C语言开发的函数。我创建了“接口(interface)”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'”,有时打印“添加了'some'”“添加了'something'”>...正确的结果是只打印“'some'补充”,因为第二个单词有子串'some',所以第二个单词不应该插入到字典中!

为什么会出现这种情况?!为什么程序有时返回正确的结果,有时却返回不正确的结果?!

<小时/>

-- 更新 --

示例.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; }

有了这个,有时我只需要“添加一些!”有时“添加了一些!”和“添加了一些东西!”,我不明白为什么会发生这种情况! :(

最佳答案

这是更好的写法:

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()。

关于Java JNI 有时结果正确有时不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8002221/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com