C ++ Java-оболочка с использованием JNI - PullRequest
5 голосов
/ 15 июня 2011

В настоящее время я пишу оболочку JNI для класса C ++, и я не уверен, что то, что я сделал до сих пор, является наиболее правильным способом.

Насколько я понимаю, невозможно объявитьJava-конструктор native, поэтому я написал что-то вроде:

package log;

public class Logger
{
    private long internalPtr = 0;

    private native long createNativeInstance(String application, String module, String function);

    public Logger(String application, String module, String function)
    {
        this.internalPtr = createNativeInstance(application, module, function);
    }

    public native String getApplication();

    static { System.loadLibrary("log_java"); }
}

По сути, мое поле internalPtr содержит указатель на мой базовый экземпляр C ++, и я создаю его в чистом Java-конструкторе, используяstatic native метод createNativeInstance().

Это правильный способ сделать что-то?

Другой вопрос, на который я мог бы получить ответ: «Как мне справиться с освобождением?»

Мои навыки Java чрезвычайно ограничены, поэтому не стесняйтесь предлагать даже более "очевидные" решения.

Большое спасибо.

1 Ответ

2 голосов
/ 16 июня 2011

Именно так я всегда реализовывал нативные классы, которые обертывают объект C / C ++. Я думаю, что написать нативный конструктор может быть немного больно, поэтому никогда не пытался.

Для перераспределения вы делаете симолярную вещь. Напишите функцию C / C ++, которая освобождает память для вашего объекта C / C ++, а затем вызовите ее из деструктора Java (метод finalize). Вот как то так:

private native void destroyNativeInstance( long p_internalPtr );

public void finalize()
{
    destroyNativeInstance( this.internalPtr );
}
...