无法使用JNI打印java中C函数返回的值

时间:2014-02-24 09:05:57

标签: java java-native-interface

我需要在我的java程序decryption()中调用函数C函数“hashvalue(string)”。我使用JNI来构建名为HashValue.dll的.dll库。问题是每当我调用hashvalue时,java程序就会终止。 这是我的头文件,C程序和java程序。 java程序

BufferedReader line = null;
    String support="";
    int itemhashtableno;
    int maxhashvalue;

    int itemsetsize;
    try { 

        line = new BufferedReader(new FileReader("F:/workspace/MTechProject-Frugal Scheme/src/authors205.txt"));
        String itemset;


        while((itemset=line.readLine())!=null)
        {
           System.out.println(itemset); 
            StringTokenizer st = new StringTokenizer(itemset);
            FrequentItemset frequentitemset = new FrequentItemset();

            for(i=0;i<st.countTokens()-1;i++)
                frequentitemset.getItemset().add(st.nextToken());

            support=st.nextToken().replaceAll("[()]","");
            frequentitemset.setSupport(Integer.parseInt(support));      

            itemsetsize = frequentitemset.getItemset().size();
            String first_item=frequentitemset.getItemset().get(0);
            String targetitem="";
            System.out.println("hi");
            maxhashvalue = hashvalue(first_item);
            System.out.println(maxhashvalue);
            System.out.println("over");
            // if the first item 
            if(AddedItemList.contains(first_item))
            {
                int firstitemhashtableno = ItemHashTable.get(first_item);
                targetitem=first_item;
                maxhashvalue = hashvalue(first_item);
                System.out.println("hi");
                System.out.println(maxhashvalue);
                 for(i=1;i<itemsetsize;i++)
                    {
                       String temp_item =  frequentitemset.getItemset().get(i);
                       if(AddedItemList.contains(temp_item))
                        {
                            itemhashtableno = ItemHashTable.get(temp_item);
                            if(itemhashtableno==firstitemhashtableno)
                            {
                                if(hashvalue(temp_item)> maxhashvalue) 
                                {
                                    maxhashvalue=hashvalue(temp_item);
                                    targetitem=temp_item;
                                }
                            }
                            else
                            {
                                System.out.println(frequentitemset.toString());
                                break;
                            }

                        }
                       else
                       {
                           System.out.println(frequentitemset.toString());
                           break;
                       }

                    }

                 if(i==itemsetsize)
                 {
                     int synopsisindex = hashvalue(synopsislist.get(firstitemhashtableno).get(0).getItem()) - hashvalue(targetitem)-1;
                     frequentitemset.setSupport(frequentitemset.getSupport()-(synopsislist.get(firstitemhashtableno).get(synopsisindex).getTimes()-synopsislist.get(firstitemhashtableno).get(synopsisindex).getOccurance()));
                     if(frequentitemset.getSupport()>=smin)
                     System.out.println(frequentitemset.toString());
                 }

            }
            else
            {
                System.out.println(frequentitemset.toString());
                continue;
            }



        }

C程序T0,T1,T2是静态数组。

#include<stdio.h>
#include<jni.h>
#include"AuthorsFrequentItemsetMining.h"



#define uchar unsigned char

JNIEXPORT jint JNICALL Java_AuthorsFrequentItemsetMining_hashvalue(JNIEnv *env,jobject obj, jstring prompt)
{
int i;
unsigned f0, f1, f2;
const uchar *kp = (*env)->GetStringUTFChars(env,prompt,0);

for (i=-13, f0=f1=f2=0; *kp; ++kp) {
    f0 += T0[i + *kp];
    f1 += T1[i + *kp];
    f2 += T2[i + *kp];
    i += 45;
}

f0 %= 2913;
f1 %= 2913;
f2 %= 2913;

if (f1 == f0 && ++f1 >= 2913)
    f1 = 0;
if (f2 == f0 && ++f2 >= 2913)
    f2 = 0;
if (f1 == f2) {
    if (++f2 >= 2913)
        f2 = 0;
    if (f2 == f0 && ++f2 >= 2913)
        f2 = 0;
}
(*env)->ReleaseStringUTFChars(env,prompt,kp);
return (g[f0] + g[f1] + g[f2]) % 2368;

}

使用javah

创建的头文件
/* DO NOT EDIT THIS FILE - it is machine generated */
   #include <jni.h>
   /* Header for class AuthorsFrequentItemsetMining */

    #ifndef _Included_AuthorsFrequentItemsetMining
    #define _Included_AuthorsFrequentItemsetMining
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
    * Class:     AuthorsFrequentItemsetMining
    * Method:    hashvalue
    * Signature: (Ljava/lang/String;)I
    */
    JNIEXPORT jint JNICALL Java_AuthorsFrequentItemsetMining_hashvalue
    (JNIEnv *, jobject, jstring);

    #ifdef __cplusplus
    }
    #endif
    #endif

1 个答案:

答案 0 :(得分:0)

数组T0 []或T1 []或T2 []没有你索引的项目如此奇怪,或者数组g []没有2913项。

我看不出为什么要为此使用JNI。它可以在Java中完美地完成,实际上可能更好。