Форум программистов, компьютерный форум, киберфорум
mutagen
Войти
Регистрация
Восстановить пароль
все вопросы по Java которые задают более 3х раз на форуме
Рейтинг: 5.00. Голосов: 1.

Работаем с нативками

Запись от mutagen размещена 24.05.2013 в 12:19. Обновил(-а) mutagen 23.07.2013 в 14:06
Показов 3870 Комментарии 0

Это был просто пост, но место ему тут

итак:
класс для теста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.io.File;
import java.util.Vector;
 
public class Runner {
 
    public static void main(String[] args) {
        String[] sa = {"a", "b", "c"};
        File f = new File("");
// чтобы не кидать либку в системную директорию - грузим её по абсолютному пути явным образом
// так как я из нетбинса пускал то у меня вот так складывается путь
        System.load(f.getAbsolutePath() + "/src/libJNIInvoker.so");
        Vector<MyClass> v = JNIInvoker.nativeGetMy(sa);
        for (MyClass mc : v) {
            System.out.println(mc.toString());
        }
    }
}
класс с нативом
Java
1
2
3
4
5
import java.util.Vector;
 
public class JNIInvoker {
    public static native Vector<MyClass> nativeGetMy(String[] s);
}
кастом класс
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MyClass {
 
    private String s;
 
    public String getS() {
        return s;
    }
 
    public void setS(String s) {
        this.s = s;
    }
 
    @Override
    public String toString() {
        return "MyClass [s=" + s + "]";
    }
}
компилимся

Bash
1
javac JNIInvoker.java
генерим хедер

Bash
1
javah JNIInvoker
получаем хедер JNIInvoker.h

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JNIInvoker */
 
#ifndef _Included_JNIInvoker
#define _Included_JNIInvoker
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JNIInvoker
 * Method:    nativeGetMy
 * Signature: ([Ljava/lang/String;)Ljava/util/Vector;
 */
JNIEXPORT jobject JNICALL Java_JNIInvoker_nativeGetMy
  (JNIEnv *, jclass, jobjectArray);
 
#ifdef __cplusplus
}
#endif
#endif
имплементим хедер JNIInvoker.cpp

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <jni.h>
#include "JNIInvoker.h"
/*
 * Class:     JNIInvoker
 * Method:    nativeGetMy
 * Signature: ([Ljava/lang/String;)Ljava/util/Vector;
 */
JNIEXPORT jobject JNICALL Java_JNIInvoker_nativeGetMy
(JNIEnv *env, jclass jc, jobjectArray ja) {
// C стиль вызовов
    jsize stringCount = (*env).GetArrayLength(ja);
    jclass retclazz = (*env).FindClass("java/util/Vector");
    jobject ret = (*env).NewObject(retclazz, (*env).GetMethodID(retclazz, "<init>", "()V"));
// C++ стиль вызовов
    jclass myclazz = env->FindClass("MyClass");
    for (int i = 0; i < stringCount; i++) {
        jstring str = (jstring) env->GetObjectArrayElement(ja, i);
        jobject myobj = env->NewObject(myclazz, env->GetMethodID(myclazz, "<init>", "()V"));
        jmethodID setS = env->GetMethodID(myclazz, "setS", "(Ljava/lang/String;)V");
        env->CallVoidMethod(myobj, setS, str);
        jmethodID add = env->GetMethodID(retclazz, "add", "(Ljava/lang/Object;)Z");
        env->CallVoidMethod(ret, add, myobj);
    }
    return ret;
}
компилимся в либку

Bash
1
g++ -x c++ -shared -fPIC -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux -o libJNIInvoker.so  JNIInvoker.cpp
всё можно запускать
Bash
1
2
3
4
5
run:
MyClass [s=a]
MyClass [s=b]
MyClass [s=c]
BUILD SUCCESSFUL (total time: 0 seconds)
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 0
Комментарии
 
Новые блоги и статьи
Как обучить нейросеть создания картинок на Python
bytestream 24.01.2025
В эпоху цифровых технологий искусственный интеллект становится неотъемлемой частью творческого процесса. Особое место в этой области занимает разработка и обучение нейронных сетей для создания. . .
Как обучить нейросеть генерации текста на Python
bytestream 24.01.2025
В современном мире искусственный интеллект и машинное обучение становятся неотъемлемой частью многих технологических решений. Одной из наиболее интересных и востребованных задач в этой области. . .
Машинное обучение на Python
bytestream 24.01.2025
Введение в машинное обучение на Python Машинное обучение представляет собой одну из наиболее динамично развивающихся областей информационных технологий, которая позволяет компьютерным системам. . .
Как удалить вирус-майнер с компьютера
hw_wired 24.01.2025
Вирусы-майнеры стали одной из наиболее серьезных угроз для пользователей компьютеров. Эти вредоносные программы тайно используют вычислительные ресурсы зараженного устройства для добычи криптовалюты. . .
Что такое веб-сервер, для чего он нужен и как работает
bytestream 24.01.2025
В современную эпоху цифровых технологий веб-сервер является фундаментальным компонентом интернет-инфраструктуры, обеспечивающим функционирование множества онлайн-сервисов и веб-сайтов. Этот. . .
Как в цикле for перебрать все элементы в словаре в Python
bytestream 24.01.2025
Словари в Python представляют собой мощные структуры данных, которые позволяют хранить информацию в формате ключ-значение. Эта особенность делает их незаменимыми при работе с данными, где требуется. . .
Как отменить rebase в Git
hw_wired 24.01.2025
Git rebase представляет собой мощный инструмент для управления историей коммитов в системе контроля версий Git. Этот механизм позволяет разработчикам изменять последовательность, комбинировать или. . .
Как поменять цвет input placeholder с помощью CSS
bytestream 24.01.2025
В веб-разработке оформление элементов пользовательского интерфейса играет ключевую роль в создании привлекательного и интуитивно понятного дизайна. Особое внимание уделяется формам ввода данных, где. . .
Как перебрать все значения в перечислении (enum) в C#
bytestream 24.01.2025
Перечисление (enum) в языке программирования C# представляет собой специальный тип данных, который позволяет определить набор именованных констант. Этот мощный инструмент особенно полезен, когда. . .
Как обойтись без проверки на null, чтобы избежать NullPointerExce­ption в Java
bytestream 24.01.2025
NullPointerException (NPE) является одним из самых распространенных исключений в Java, создающих серьезные проблемы при разработке программного обеспечения. Данное исключение возникает при попытке. . .
Что лучше использовать в href ссылок в JavaScript: "#" или "javascript:voi­­d(0)­"
bytestream 24.01.2025
При разработке веб-приложений важную роль играет правильное использование HTML-ссылок в сочетании с JavaScript. Одним из ключевых аспектов является выбор корректного значения атрибута href для. . .
Как узнать индекс элемента списка по его значению в Python
hw_wired 24.01.2025
При работе с коллекциями данных в Python часто возникает необходимость не только манипулировать элементами списка, но и определять их точное местоположение. Индекс элемента представляет собой. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru