Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
6 / 6 / 2
Регистрация: 04.10.2011
Сообщений: 115
1

JNI return class

09.04.2013, 22:41. Показов 2112. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вопрос, из за которого рушится дипломный проект.
Обьясните, или дайте сылку на источник, как возможно вернуть в java из с++ вектор объектов.
Vector<MyObject>
Аналоги класса существуеют и в С++ и в java.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.04.2013, 22:41
Ответы с готовыми решениями:

Что это isOk(int s),setAge(int g){if(isOk(g){age=g;return true;}else{.;return false;}}.getName(){return name;}?
package com.company; import java.io.Serializable; public class person implements Serializable {...

Как исправить ошибку error C2230: "a member function of a managed class cannot return a non-managed class"
Здравствуйте! Помогите пожалуйста исправить ошибку error C2230: 'GenerateRandomHReal' : a...

Разъясните код пжлст(выдает ошибку:cannot convert from 'class std::list<class c_bullet *,class std::allocator<class c_bullet *> >::iterator' to 'int')
Есть такие строки: std::list&lt;c_bullet*&gt; Bullets; ... for(auto i = Bullets.begin(); i !=...

bad class file: C:Program FilesJavajre1.5.0_02lib t.jar(java/lang/Object.class) class file has wrong version 49.0, should be 48.0
написал тестовый td_jsp.jsp фаил -&gt;&gt; &lt;html&gt; &lt;head&gt;&lt;title&gt;JSP test&lt;/title&gt;&lt;/head&gt; ...

19
653 / 402 / 35
Регистрация: 19.02.2013
Сообщений: 1,072
Записей в блоге: 2
09.04.2013, 22:48 2
мне чего-то интуиция подсказывает, что максимум вы можете надеется на массив примитивов. а в голову приходит токо (де)сериализация в хмл\жсон. но я жни в глаза не видел, меня слушать нельзя)
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
10.04.2013, 01:32 3
Лучший ответ Сообщение было отмечено как решение

Решение

краткий хелпчик достойный наверное даже статьи
итак:
класс для теста
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++, а ниже  3 по C способу
    jsize stringCount = (*env).GetArrayLength(ja);
    jclass retclazz = (*env).FindClass("java/util/Vector");
    jobject ret = (*env).NewObject(retclazz, (*env).GetMethodID(retclazz, "<init>", "()V"));
 
    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)
3
Просто Лис
Эксперт Python
5731 / 3530 / 1055
Регистрация: 17.05.2012
Сообщений: 10,360
Записей в блоге: 9
24.05.2013, 11:56 4
Подскажите почему пример не работает в windows.
Библиотека компилируется так:
Bash
1
g++ -x c++ -shared -I "C:\Program Files\Java\jdk1.7.0_02\include" -I "C:\Program Files\Java\jdk1.7.0_02\include\win32" -o libJNIInvoker.dll JNIInvoker.cpp
файл Runner.java
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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.out.println(f.getAbsolutePath() + "\\libJNIInvoker.dll");
        System.load(f.getAbsolutePath() + "\\libJNIInvoker.dll");
        //System.loadLibrary("libJNIInvoker");
        //JNIInvoker.test();
        Vector<MyClass> v = JNIInvoker.nativeGetMy(sa);
        for (MyClass mc : v) {
            System.out.println(mc.toString());
        }
    }
}
вывод ошибки в консоли:
Код
E:\proekts\test>java Runner
Exception in thread "main" java.lang.UnsatisfiedLinkError: JNIInvoker.nativeGetMy([Ljava/lang/String;)Ljava/util/Vector;
        at JNIInvoker.nativeGetMy(Native Method)
        at Runner.main(Runner.java:14)
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.05.2013, 12:05 5
строчка -
Java
1
System.loadLibrary("libJNIInvoker");
загружает либу в JVM, а вы её выкинули зачемто
0
Просто Лис
Эксперт Python
5731 / 3530 / 1055
Регистрация: 17.05.2012
Сообщений: 10,360
Записей в блоге: 9
24.05.2013, 12:09 6
и с этой строчкой всё то же исключение выскакивает
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.05.2013, 12:16 7
где лежит libJNIInvoker.dll ?
0
Просто Лис
Эксперт Python
5731 / 3530 / 1055
Регистрация: 17.05.2012
Сообщений: 10,360
Записей в блоге: 9
24.05.2013, 12:19 8
в папке с остальными файлами в E:\proekts\test
Там же лежит, например, файл Runner.java
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.05.2013, 12:21 9
он должен лежать там где лежит
Java
1
Runner.class
так как
Java
1
new File("");
создаёт путь к точке откуда выполнился запуск класса
0
Просто Лис
Эксперт Python
5731 / 3530 / 1055
Регистрация: 17.05.2012
Сообщений: 10,360
Записей в блоге: 9
24.05.2013, 12:25 10
все файлы в одной папке
Миниатюры
JNI return class  
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.05.2013, 12:26 11
тогда сделайте так
Java
1
System.load("libJNIInvoker.dll");
винда она туповатая и ищет либку сходу в текущем каталоге
0
Просто Лис
Эксперт Python
5731 / 3530 / 1055
Регистрация: 17.05.2012
Сообщений: 10,360
Записей в блоге: 9
24.05.2013, 12:32 12
Теперь не может найти библиотеку
Код
E:\proekts\test>java Runner
Exception in thread "main" java.lang.UnsatisfiedLinkError: Expecting an absolute
 path of the library: libJNIInvoker.dll
        at java.lang.Runtime.load0(Unknown Source)
        at java.lang.System.load(Unknown Source)
        at Runner.main(Runner.java:14)
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.05.2013, 12:37 13
ой забыл метод поменять
вот так надо
Java
1
System.loadLibrary("libJNIInvoker.dll");
0
Просто Лис
Эксперт Python
5731 / 3530 / 1055
Регистрация: 17.05.2012
Сообщений: 10,360
Записей в блоге: 9
24.05.2013, 12:41 14
если
Java
1
System.loadLibrary("libJNIInvoker.dll");
то не может найти библиотеку
Код
E:\proekts\test>java Runner
Exception in thread "main" java.lang.UnsatisfiedLinkError: no libJNIInvoker.dll
in java.library.path
        at java.lang.ClassLoader.loadLibrary(Unknown Source)
        at java.lang.Runtime.loadLibrary0(Unknown Source)
        at java.lang.System.loadLibrary(Unknown Source)
        at Runner.main(Runner.java:14)
если
Java
1
System.loadLibrary("libJNIInvoker");
то не может найти метод
Код
E:\proekts\test>java Runner
Exception in thread "main" java.lang.UnsatisfiedLinkError: JNIInvoker.nativeGetM
y([Ljava/lang/String;)Ljava/util/Vector;
        at JNIInvoker.nativeGetMy(Native Method)
        at Runner.main(Runner.java:19)
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.05.2013, 12:46 15
о вишь значит либку мы таки загрузили, это уже хорошо,
теперь показывай что менял в нативке и опиши шаги как ты это делал
0
Просто Лис
Эксперт Python
5731 / 3530 / 1055
Регистрация: 17.05.2012
Сообщений: 10,360
Записей в блоге: 9
24.05.2013, 12:59 16
создал файл JNIInvoker.java
Java
1
2
3
public class JNIInvoker {
    public static native void test();
}
файл Runner.java
Java
1
2
3
4
5
6
public class Runner {
    public static void main(String[] args) {
        System.loadLibrary("libJNIInvoker");
        JNIInvoker.test();
    }
}
компилирую файл JNIInvoker.java и создаю JNIInvoker.h
Bash
1
2
javac JNIInvoker.java
javah JNIInvoker
файл JNIInvoker.h
C
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:    test
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_JNIInvoker_test
  (JNIEnv *, jclass);
 
#ifdef __cplusplus
}
#endif
#endif
в этом файле копирую объявление метода JNIEXPORT void JNICALL Java_JNIInvoker_test (JNIEnv *, jclass); и создаю файл JNIInvoker.cpp с реализацией этого метода
файл JNIInvoker.cpp
C++
1
2
3
4
5
#include <stdio.h>
#include "JNIInvoker.h"
JNIEXPORT void JNICALL Java_JNIInvoker_test(JNIEnv *, jclass){
    printf("Hello\n");
}
компилирую библиотеку, файл Runner.java и запускаю
Bash
1
2
3
g++ -x c++ -shared -I "C:\Program Files\Java\jdk1.7.0_02\include" -I "C:\Program Files\Java\jdk1.7.0_02\include\win32" -o libJNIInvoker.dll JNIInvoker.cpp
javac Runner.java
java Runner
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.05.2013, 13:01 17
Цитата Сообщение от Рыжий Лис Посмотреть сообщение
JNIInvoker.nativeGetMy([Ljava/lang/StringLjava/util/Vector;
означает что вы не перекомпилировали класс Runner и он всё ещё с моим кодом (я на всякий случай пересобирал бы все с предварительным удалением class файлов)
0
Просто Лис
Эксперт Python
5731 / 3530 / 1055
Регистрация: 17.05.2012
Сообщений: 10,360
Записей в блоге: 9
24.05.2013, 13:05 18
удалил все class файлы и еще раз перекомпилировал
Код
E:\proekts\test>java Runner
Exception in thread "main" java.lang.UnsatisfiedLinkError: JNIInvoker.test()V
        at JNIInvoker.test(Native Method)
        at Runner.main(Runner.java:4)
0
2586 / 2259 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
24.05.2013, 15:38 19
Сделайте 1 раз всё по порядку как я написал в своём посте, не надо дёргаться туда сюда, ато я опять вижу незагруженную либу
хотя этот этап мы уже вроде прошли
1
Просто Лис
Эксперт Python
5731 / 3530 / 1055
Регистрация: 17.05.2012
Сообщений: 10,360
Записей в блоге: 9
25.05.2013, 11:06 20
Нашёл в чём ошибка. С java кодом все в порядке. Я неправильно компилирую библиотеку dll. В библиотеке метод имеет имя Java_Test_test@8 , а java обращается к методу Java_Test_test.

mutagen, спасибо за помошь.

Добавлено через 13 часов 49 минут
Правильно библиотеку компилировать надо так:
Bash
1
g++ -x c++ -Wl,--kill-at -save-temps -shared -I "C:\Program Files\Java\jdk1.7.0_02\include" -I "C:\Program Files\Java\jdk1.7.0_02\include\win32" -o Test.dll Test.cpp
0
25.05.2013, 11:06
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.05.2013, 11:06
Помогаю со студенческими работами здесь

Что такое в jquery и java return false и return true
Если я правильно понимаю, то return false отменяет действие по умолчанию, например клик по ссылке,...

В чем разница между return и return false/true
Привет всем. Вот подскажите плиз) return; return false; return true; расскажите пожалуйста...

Односвязный список - объясните, как работают return 0 и return 1
проверьте, пжлса, по комментариям правильно ли я поняла принцип работы программы. Объясните, как...

How can to return value (return value; ) of javascript function to ASP ?
How can to return value (return value; ) of javascript function to ASP ?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru