我在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',所以第二个单词不应插入dictonary!
为什么会这样?!为什么有时程序会返回正确的结果,有时候不会??
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; }
有了这个,有时我只有“添加了一些!”有时“添加一些!”和“添加的东西!”,我不明白为什么会这样! :(
答案 0 :(得分:2)
这是一种更好的写作方式:
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,可能要仔细检查dic.find()。