Гайд Java native (JNI) tutorial

  • Автор темы Автор темы wigonoit
  • Дата начала Дата начала
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
23 Июн 2022
Сообщения
44
Реакции
2
Данная тема создана для тех кто не знал.
Не пишите комментарии типо: /del я это уже знал

Наверняка вы видели в папке natives такой файл lwjgl.dll. Это native библиотека написаная для игр (Почитать о ней вы можете здесь:
Пожалуйста, авторизуйтесь для просмотра ссылки.
). Так вот, вы можете создать свою библиотеку или защитить проект.

1. Создайте новый проект в вашей среде разработки.

2. Замените:

Java:
Expand Collapse Copy
public static void main(String[] args) {}

на:

Java:
Expand Collapse Copy
public static native void main(String[] args);

3. Зайдите в terminal (на windows это консоль) и пропишите данные команды:

cd директория до вашего проекта который вы создали
javac -h . Класс который хотите сделать нативным (эту команду напишите обязательно с точкой перед директорией)

4. После выполнения данных команд у вас в проекте появится файл с расширением .h с которым нужно выполнить данные процедуры:

Откройте его в любом редакторе (можно в блокноте) и скопируйте код похожий на этот: JNIEXPORT void JNICALL Java_native_Main_main(JNIEnv *, jclass, jobjectArray)
Создайте файл с таким же названием как и у .h но с расширением .cpp и вставьте тот код который вы скопировали
Сделайте такую структуру файла:

C++:
Expand Collapse Copy
#include "вставьте название .h файла с расширением"
#include <iostream>

using namespace std;

// Замените заголовок на тот который скопировали ранее

JNIEXPORT void JNICALL Java_native_Main_main(JNIEnv *, jclass, jobjectArray) {
    cout << "Hello"
}
Обратите внимание на первую строку: #include "вставьте название .h файла с расширением".

5. Зайдите обратно в terminal/cmd и впишите команды:

g++ -c -I"C:\Program Files\Java\jdk-12.0.1\include" -I"C:\Program Files\Java\jdk-12.0.1\include\win32" native_Main.cpp -o native.o
g++ -shared -o native.dll native.o -Wl,--add-stdcall-alias
Убедитесь что у вас все пути правильны.

6. Добавьте в свой Main класс:

Java:
Expand Collapse Copy
static {
   String filePath = null;

   if (System.getProperty("os.arch").contains("64")) {
      filePath = "/native/lib/native.dll";
   }

   if (filePath != null) {
      InputStream resourceFilePath = Main.class.getResourceAsStream(filePath);

      if (resourceFilePath != null) {
         File tempFile;
         try {
            tempFile = File.createTempFile("lib", null);
            tempFile.deleteOnExit();
            if (!tempFile.exists()) {
               throw new IOException();
            }
         } catch (IOException e) {
            throw new UnsatisfiedLinkError("Failed to create temp file");
         }
         byte[] buffer = new byte[2048];
         try (InputStream inputStream = resourceFilePath;
              FileOutputStream outputStream = new FileOutputStream(tempFile)) {
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
               outputStream.write(buffer, 0, bytesRead);
            }
         } catch (IOException e) {
            throw new UnsatisfiedLinkError("Failed to copy file: " + e.getMessage());
         }
         System.load(tempFile.getAbsolutePath());
      }
   } else {
      System.out.println("Your system is not suitable.");
   }
}

7. Создайте директорию в своём проекте: /native/lib/ и переместите native.dll в этот путь.

Готово! Запускайте программу и радуйтесь.

P.S. Если что-то не получилось не пишите мне. Я вам смогу помочь только если у вас Mac.
 
6. Добавьте в свой Main класс:

Java:
Expand Collapse Copy
static {
   String filePath = null;

   if (System.getProperty("os.arch").contains("64")) {
      filePath = "/native/lib/native.dll";
   }

   if (filePath != null) {
      InputStream resourceFilePath = Main.class.getResourceAsStream(filePath);

      if (resourceFilePath != null) {
         File tempFile;
         try {
            tempFile = File.createTempFile("lib", null);
            tempFile.deleteOnExit();
            if (!tempFile.exists()) {
               throw new IOException();
            }
         } catch (IOException e) {
            throw new UnsatisfiedLinkError("Failed to create temp file");
         }
         byte[] buffer = new byte[2048];
         try (InputStream inputStream = resourceFilePath;
              FileOutputStream outputStream = new FileOutputStream(tempFile)) {
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
               outputStream.write(buffer, 0, bytesRead);
            }
         } catch (IOException e) {
            throw new UnsatisfiedLinkError("Failed to copy file: " + e.getMessage());
         }
         System.load(tempFile.getAbsolutePath());
      }
   } else {
      System.out.println("Your system is not suitable.");
   }
}
это вообще пиздец, зачем делать так, если можно просто
example:
Expand Collapse Copy
    static {
        loadNatives();
    }

    private static void loadNatives() {
        try {

            System.load("C:\\Folder\\Libraries\\n64.dll");

        }catch (UnsatisfiedLinkError exception) {
            exception.printStackTrace();
        }
    }
ну а так тема довольно таки очень маленькая
 
Последнее редактирование:
это вообще пиздец, зачем делать так, если можно просто
example:
Expand Collapse Copy
    static {
        loadNatives();
    }

    private static void loadNatives() {
        try {

            System.load("C:\\Folder\\Libraries\\n64.dll");

        }catch (UnsatisfiedLinkError exception) {
            exception.printStackTrace();
        }
    }
ну а так тема довольно таки очень маленькая
Я делал под другой проект поэтому такой код
 
ладно, отговорю неадекватов кто поверил что это спасет вашу целку :
не спасет.

та и гайд хуйня ес честн.
Против пастеров которые в своей жизни ничего не видели подходит. Да не спорю, взломать можно. Например просто подменить библиотеку. Но можно сделать проверку на действительность.

Вывод: смотря как защищать.
 
Против пастеров которые в своей жизни ничего не видели подходит. Да не спорю, взломать можно. Например просто подменить библиотеку. Но можно сделать проверку на действительность.

Вывод: смотря как защищать.
ну если будешь верифать на джава сайде то F
 
Так сделает только не знающий или отбитый. Если проверку делать на стороне java то её можно убрать при помощи Recaf.
так твой нативный вызов з "защитой" тоже "можно убрать при помощи Recaf"
 
так твой нативный вызов з "защитой" тоже "можно убрать при помощи Recaf"
Поэтому нативка не поможет если нативно не делаются вещи необходимые для непосредсвенной работы фигни
 
Данная тема создана для тех кто не знал.
Не пишите комментарии типо: /del я это уже знал

Наверняка вы видели в папке natives такой файл lwjgl.dll. Это native библиотека написаная для игр (Почитать о ней вы можете здесь:
Пожалуйста, авторизуйтесь для просмотра ссылки.
). Так вот, вы можете создать свою библиотеку или защитить проект.

1. Создайте новый проект в вашей среде разработки.

2. Замените:

Java:
Expand Collapse Copy
public static void main(String[] args) {}

на:

Java:
Expand Collapse Copy
public static native void main(String[] args);

3. Зайдите в terminal (на windows это консоль) и пропишите данные команды:

cd директория до вашего проекта который вы создали
javac -h . Класс который хотите сделать нативным (эту команду напишите обязательно с точкой перед директорией)

4. После выполнения данных команд у вас в проекте появится файл с расширением .h с которым нужно выполнить данные процедуры:

Откройте его в любом редакторе (можно в блокноте) и скопируйте код похожий на этот: JNIEXPORT void JNICALL Java_native_Main_main(JNIEnv *, jclass, jobjectArray)
Создайте файл с таким же названием как и у .h но с расширением .cpp и вставьте тот код который вы скопировали
Сделайте такую структуру файла:

C++:
Expand Collapse Copy
#include "вставьте название .h файла с расширением"
#include <iostream>

using namespace std;

// Замените заголовок на тот который скопировали ранее

JNIEXPORT void JNICALL Java_native_Main_main(JNIEnv *, jclass, jobjectArray) {
    cout << "Hello"
}
Обратите внимание на первую строку: #include "вставьте название .h файла с расширением".

5. Зайдите обратно в terminal/cmd и впишите команды:

g++ -c -I"C:\Program Files\Java\jdk-12.0.1\include" -I"C:\Program Files\Java\jdk-12.0.1\include\win32" native_Main.cpp -o native.o
g++ -shared -o native.dll native.o -Wl,--add-stdcall-alias
Убедитесь что у вас все пути правильны.

6. Добавьте в свой Main класс:

Java:
Expand Collapse Copy
static {
   String filePath = null;

   if (System.getProperty("os.arch").contains("64")) {
      filePath = "/native/lib/native.dll";
   }

   if (filePath != null) {
      InputStream resourceFilePath = Main.class.getResourceAsStream(filePath);

      if (resourceFilePath != null) {
         File tempFile;
         try {
            tempFile = File.createTempFile("lib", null);
            tempFile.deleteOnExit();
            if (!tempFile.exists()) {
               throw new IOException();
            }
         } catch (IOException e) {
            throw new UnsatisfiedLinkError("Failed to create temp file");
         }
         byte[] buffer = new byte[2048];
         try (InputStream inputStream = resourceFilePath;
              FileOutputStream outputStream = new FileOutputStream(tempFile)) {
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
               outputStream.write(buffer, 0, bytesRead);
            }
         } catch (IOException e) {
            throw new UnsatisfiedLinkError("Failed to copy file: " + e.getMessage());
         }
         System.load(tempFile.getAbsolutePath());
      }
   } else {
      System.out.println("Your system is not suitable.");
   }
}

7. Создайте директорию в своём проекте: /native/lib/ и переместите native.dll в этот путь.

Готово! Запускайте программу и радуйтесь.

P.S. Если что-то не получилось не пишите мне. Я вам смогу помочь только если у вас Mac.
а зачем)
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Данная тема создана для тех кто не знал.
Не пишите комментарии типо: /del я это уже знал

Наверняка вы видели в папке natives такой файл lwjgl.dll. Это native библиотека написаная для игр (Почитать о ней вы можете здесь:
Пожалуйста, авторизуйтесь для просмотра ссылки.
). Так вот, вы можете создать свою библиотеку или защитить проект.

1. Создайте новый проект в вашей среде разработки.

2. Замените:

Java:
Expand Collapse Copy
public static void main(String[] args) {}

на:

Java:
Expand Collapse Copy
public static native void main(String[] args);

3. Зайдите в terminal (на windows это консоль) и пропишите данные команды:

cd директория до вашего проекта который вы создали
javac -h . Класс который хотите сделать нативным (эту команду напишите обязательно с точкой перед директорией)

4. После выполнения данных команд у вас в проекте появится файл с расширением .h с которым нужно выполнить данные процедуры:

Откройте его в любом редакторе (можно в блокноте) и скопируйте код похожий на этот: JNIEXPORT void JNICALL Java_native_Main_main(JNIEnv *, jclass, jobjectArray)
Создайте файл с таким же названием как и у .h но с расширением .cpp и вставьте тот код который вы скопировали
Сделайте такую структуру файла:

C++:
Expand Collapse Copy
#include "вставьте название .h файла с расширением"
#include <iostream>

using namespace std;

// Замените заголовок на тот который скопировали ранее

JNIEXPORT void JNICALL Java_native_Main_main(JNIEnv *, jclass, jobjectArray) {
    cout << "Hello"
}
Обратите внимание на первую строку: #include "вставьте название .h файла с расширением".

5. Зайдите обратно в terminal/cmd и впишите команды:

g++ -c -I"C:\Program Files\Java\jdk-12.0.1\include" -I"C:\Program Files\Java\jdk-12.0.1\include\win32" native_Main.cpp -o native.o
g++ -shared -o native.dll native.o -Wl,--add-stdcall-alias
Убедитесь что у вас все пути правильны.

6. Добавьте в свой Main класс:

Java:
Expand Collapse Copy
static {
   String filePath = null;

   if (System.getProperty("os.arch").contains("64")) {
      filePath = "/native/lib/native.dll";
   }

   if (filePath != null) {
      InputStream resourceFilePath = Main.class.getResourceAsStream(filePath);

      if (resourceFilePath != null) {
         File tempFile;
         try {
            tempFile = File.createTempFile("lib", null);
            tempFile.deleteOnExit();
            if (!tempFile.exists()) {
               throw new IOException();
            }
         } catch (IOException e) {
            throw new UnsatisfiedLinkError("Failed to create temp file");
         }
         byte[] buffer = new byte[2048];
         try (InputStream inputStream = resourceFilePath;
              FileOutputStream outputStream = new FileOutputStream(tempFile)) {
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
               outputStream.write(buffer, 0, bytesRead);
            }
         } catch (IOException e) {
            throw new UnsatisfiedLinkError("Failed to copy file: " + e.getMessage());
         }
         System.load(tempFile.getAbsolutePath());
      }
   } else {
      System.out.println("Your system is not suitable.");
   }
}

7. Создайте директорию в своём проекте: /native/lib/ и переместите native.dll в этот путь.

Готово! Запускайте программу и радуйтесь.

P.S. Если что-то не получилось не пишите мне. Я вам смогу помочь только если у вас Mac.
ну не поможет это ваще никому бля))
 
Данная тема создана для тех кто не знал.
Не пишите комментарии типо: /del я это уже знал

Наверняка вы видели в папке natives такой файл lwjgl.dll. Это native библиотека написаная для игр (Почитать о ней вы можете здесь:
Пожалуйста, авторизуйтесь для просмотра ссылки.
). Так вот, вы можете создать свою библиотеку или защитить проект.

1. Создайте новый проект в вашей среде разработки.

2. Замените:

Java:
Expand Collapse Copy
public static void main(String[] args) {}

на:

Java:
Expand Collapse Copy
public static native void main(String[] args);

3. Зайдите в terminal (на windows это консоль) и пропишите данные команды:

cd директория до вашего проекта который вы создали
javac -h . Класс который хотите сделать нативным (эту команду напишите обязательно с точкой перед директорией)

4. После выполнения данных команд у вас в проекте появится файл с расширением .h с которым нужно выполнить данные процедуры:

Откройте его в любом редакторе (можно в блокноте) и скопируйте код похожий на этот: JNIEXPORT void JNICALL Java_native_Main_main(JNIEnv *, jclass, jobjectArray)
Создайте файл с таким же названием как и у .h но с расширением .cpp и вставьте тот код который вы скопировали
Сделайте такую структуру файла:

C++:
Expand Collapse Copy
#include "вставьте название .h файла с расширением"
#include <iostream>

using namespace std;

// Замените заголовок на тот который скопировали ранее

JNIEXPORT void JNICALL Java_native_Main_main(JNIEnv *, jclass, jobjectArray) {
    cout << "Hello"
}
Обратите внимание на первую строку: #include "вставьте название .h файла с расширением".

5. Зайдите обратно в terminal/cmd и впишите команды:

g++ -c -I"C:\Program Files\Java\jdk-12.0.1\include" -I"C:\Program Files\Java\jdk-12.0.1\include\win32" native_Main.cpp -o native.o
g++ -shared -o native.dll native.o -Wl,--add-stdcall-alias
Убедитесь что у вас все пути правильны.

6. Добавьте в свой Main класс:

Java:
Expand Collapse Copy
static {
   String filePath = null;

   if (System.getProperty("os.arch").contains("64")) {
      filePath = "/native/lib/native.dll";
   }

   if (filePath != null) {
      InputStream resourceFilePath = Main.class.getResourceAsStream(filePath);

      if (resourceFilePath != null) {
         File tempFile;
         try {
            tempFile = File.createTempFile("lib", null);
            tempFile.deleteOnExit();
            if (!tempFile.exists()) {
               throw new IOException();
            }
         } catch (IOException e) {
            throw new UnsatisfiedLinkError("Failed to create temp file");
         }
         byte[] buffer = new byte[2048];
         try (InputStream inputStream = resourceFilePath;
              FileOutputStream outputStream = new FileOutputStream(tempFile)) {
            int bytesRead;
            while ((bytesRead = inputStream.read(buffer)) != -1) {
               outputStream.write(buffer, 0, bytesRead);
            }
         } catch (IOException e) {
            throw new UnsatisfiedLinkError("Failed to copy file: " + e.getMessage());
         }
         System.load(tempFile.getAbsolutePath());
      }
   } else {
      System.out.println("Your system is not suitable.");
   }
}

7. Создайте директорию в своём проекте: /native/lib/ и переместите native.dll в этот путь.

Готово! Запускайте программу и радуйтесь.

P.S. Если что-то не получилось не пишите мне. Я вам смогу помочь только если у вас Mac.
Друг, данная нативка никак не поможет, но только если ты ее немного перепишешь и во первых сделаешь следующее

Чтобы можно было делать не один класс нативным, а несколько или сразу весь проект (это очень легко сделать)
 
Друг, данная нативка никак не поможет, но только если ты ее немного перепишешь и во первых сделаешь следующее

Чтобы можно было делать не один класс нативным, а несколько или сразу весь проект (это очень легко сделать)
привет =) че ты хуйню несешь? =(
 
А какой смысл ? Это же первая ссылка в гугле на хабр в котором все намного лучше описано
Screenshot_1.png
 
Друг, данная нативка никак не поможет, но только если ты ее немного перепишешь и во первых сделаешь следующее

Чтобы можно было делать не один класс нативным, а несколько или сразу весь проект (это очень легко сделать)
минус оптимизация)
 
Назад
Сверху Снизу