1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/smirkcat-ImgJni

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Если вы не знаете, как использовать JNI для генерации, обратитесь к разделу с объяснением Java-кода в проекте [scalacpptest][1]

Как загрузить DLL из JAR-пакета, обратитесь к проекту [loaddll][2]

Этот пример демонстрирует вызов C++-класса через JNI

  • Другими словами, Java может вызывать C++-классы через JNI
  • Основная идея заключается в том, чтобы вернуть указатель на объект C++, а при вызове методов передавать этот указатель
  • Почему так? Из-за того что ранее использовались глобальные (статические) переменные, что было небезопасно, особенно когда каждый класс требует свои уникальные параметры. Это также создает проблемы при работе с многопоточностью. Вместо этого управление лучше доверить Java
  • Такой подход позволяет заменять существующие JNI-функции, переопределяя отношения между методами

Этот проект с JNI-C++ имеет следующее соответствие Java-кода

package org.img.processing;

import org.smirkcat.loaddll;

/**
 * @author smirklijie
 * @date 2016-07-07 17:27:05
 * @description Пример использования Java для вызова C++-интерфейсов
 */
public class ImgJni {
    // Указатель на функцию, адрес указателя на Linux 64-bit составляет 8 байт, поэтому требуется 64-битное хранение, которое должно быть инициализировано функцией init()
    public long ptrNative;
    
    public ImgJni() {
        ptrNative = init();
    }

    public ImgJni(String path) {
        ptrNative = initPath(path);
    }

    /**
     * Обработка изображения, возвращает информацию
     * @param ptrNative
     * @param img
     * @return
     */
    public native String processing(long ptrNative, byte[] img);
}
``````java
/**
 * Инициализация класса и модели файла
 * @param path
 * @return
 */
public native long initPath(String path);

/**
 * Инициализация класса
 * @return
 */
public native long init();

/**
 * Удаление C++-класса, убедитесь, что он больше не используется; иначе вам потребуется повторно выполнить init(), чтобы присвоить значение ptrNative
 * Может быть выполнен только один раз, второй вызов приведёт к ошибке, освобождение памяти происходит только один раз
 * @return
 */
public native void delete(long ptrNative);

// Статический вызов выполняется только один раз, загружает локальную библиотеку, скомпилированный динамический модуль следует поместить в src/main/resources
// Здесь используется моя реализация проекта loaddll для загрузки, можно использовать стандартные методы для загрузки
static {
    try {
        JarDllJava.loadLib("libimgjni", "/dll/", ImgJni.class);
        System.out.println("Загрузка динамической библиотеки libimgjni завершена");
    } catch (Exception e) {
        System.err.println("Не удалось загрузить динамическую библиотеку libimgjni, сообщение об ошибке: " + e.getMessage());
    }
}
### Соответствующий C++ код смотрите в исходных файлах

### Ссылки для справки
+ [http://www.2cto.com/kf/201207/143036.html](http://www.2cto.com/kf/201207/143036.html)
+ [http://blog.csdn.net/imyfriend/article/details/9117917](http://blog.csdn.net/imyfriend/article/details/9117917)

[1]: https://git.oschina.net/smirkcat/scalacpptest.git
[2]: https://git.oschina.net/smirkcat/loaddll.git
```

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Описание недоступно Развернуть Свернуть
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/smirkcat-ImgJni.git
git@api.gitlife.ru:oschina-mirror/smirkcat-ImgJni.git
oschina-mirror
smirkcat-ImgJni
smirkcat-ImgJni
master