Исключение нехватки памяти при доступе к Java Hashmap из JNI - PullRequest
0 голосов
/ 21 апреля 2011

HI.Я пишу программу, используя мост jni.net.Мост jni.net является C # оберткой JNI. Проблема: Я создаю объект хеш-карты из c #, используя jni.net bridge .когда я пытаюсь вызвать метод put (object, object) хэш-карты, возникает исключение OutOFMemory;« недостаточно памяти для продолжения выполнения программы » я также ловлю исключение, и когда я проверяю, поставленная операция была успешной или нет, я вызываю метод get (key) и узнаю, что ключ был введен успешно.

Эта ошибка возникает только при попытке установить новую пару значений ключа, если я хочу обновить предыдущее значение ключа без ошибок ....

нужны ваши экспертные мнения.Код приведен ниже

Это код

using System;
using System.Collections.Generic;
using System.Text;
using Jni.Net.Bridge;


namespace JNINetHashTable
{
    class HashTable
    {

        readonly static JClass hastTableClass;
        readonly static JClass employeeClass;

        readonly static JConstructor empconstr;
        readonly static JMethod getName;
        readonly static JMethod setName;
        readonly static JObject classObject;
        readonly static JConstructor constr;
        readonly static JMethod put;
        readonly static JMethod get;
        readonly static JMethod size;
        readonly static JMethod remove;
        readonly static JMethod clear;

        readonly static JMethod getNumber;
        readonly static JMethod setNumber;
        static JObject empObj;
        static HashTable()
        {

            employeeClass = JClass.ForName("Employee");
            Console.WriteLine("Check  Point1...!");
            empconstr = employeeClass.GetConstructor("()V");
            empObj = employeeClass.NewInstance();
            setName = employeeClass.GetMethod("setName", "(Ljava/lang/String;)V");
            getName = employeeClass.GetMethod("getName", "()Ljava/lang/String;");
            getNumber = employeeClass.GetMethod("getNumber", "()I");
            setNumber = employeeClass.GetMethod("setNumber", "(I)V");


            hastTableClass = JClass.ForName("java/util/HashMap");

            constr = hastTableClass.GetConstructor("()V");
            classObject = hastTableClass.NewInstance();


            put = hastTableClass.GetMethod("put", "(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;");
            get=hastTableClass.GetMethod("get","(Ljava/lang/Object;)Ljava/lang/Object;");
            size = hastTableClass.GetMethod("size", "()I");
            remove = hastTableClass.GetMethod("remove", "(Ljava/lang/Object;)Ljava/lang/Object;");
            clear = hastTableClass.GetMethod("clear", "()V");
        }
        public  void addItem(JString key,int value)
        {

            empObj = employeeClass.NewInstance();
            setName.CallVoid(empObj,key);
            setNumber.CallVoid(empObj,value);
            int a = getNumber.CallInt(empObj);

                JObject obj = put.CallObject(classObject, key, empObj);

            Console.WriteLine("Writing Time " + a);

        }
        public  string getItem(JString key)
        {
           empObj  = get.CallObject(classObject,key);
           int a = getNumber.CallInt(empObj);
           JObject str = getName.CallObject(empObj);
           string name = JString.getString(str);
           return  name+" : "+a;
        }
        public int hashsize()
        {
            int a=size.CallInt(classObject);
            return a;
        }
        public bool removeKey(JString key)
        {
            JObject jo = remove.CallObject(classObject, key);
            if (jo != null)
                return true;
            else return false;

        }
        public void clearAll()
        {
            clear.CallVoid(classObject);
        }
    }

}

JClass - это класс c #, который охватывает jclass класса jni в соответствии с реализацией JNI.net.bridge есть ли другой вопрос, чтобы сделать его более понятным ...?

1 Ответ

0 голосов
/ 06 мая 2011

решено, вопросы были в callobject методе JMethod класса.

if(r==IntPtr.Zero) return null; JThrowable.CheckAndThrow (); return new JObject(r);

Конструктор заданий Becasue выдает исключение, если ptr равен нулю;

...