2014-12-12 3 views
1

У меня есть старое приложение (C++), которое я хочу вызывать с помощью java через JNI. Итак, я прочитал несколько руководств и основы (вызов метода на C++ с Java) работал очень хорошо.JNI - создать экземпляр другого класса C++

Но теперь моя проблема в том, что я хочу экземпляр другого объекта C++ в методе, который используется JNI. Это принципиально невозможно или есть ли способ сделать это?

Для объяснения:

Это мой Java-класс helloworld.java который вызывает нативный метод 'callnative()'

public class helloworld{ 
    private native void callnative(); 

    public static void main(String[] args){ 
    new helloworld().callnative(); 

    } 

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

Это нативный метод java_helloworld_callnative (..)

#include <jni.h> 
#include <stdio.h> 
#include "helloworld.h" 
#include "hellouniverse.h" 

JNIEXPORT void JNICALL Java_helloworld_callnative(JNIEnv *env, 
               jobject obj) 
{ 
    printf("HelloWorld\n"); 
    hellouniverse *h = new hellouniverse(); 
    h->printHelloUniverse(); 
    return; 
} 

Это класс hellouniverse

#include "hellouniverse.h" 
#include <stdio.h> 
#include <string> 

using namespace std; 

hellouniverse::hellouniverse(){ 
} 

void hellouniverse::printHelloUniverse(){ 
    printf("HelloUniverse!!\n"); 
} 

Я составил helloworld.cpp с:

г ++ -fPIC -shared -I $ JAVA_PATH/включают -I $ JAVA_PATH/включать/Linux/-o libhelloworld.so hellworld.cpp

и hellouniverse.cpp с:

г ++ -c -o hellouniverse.o hellouniverse.cpp

при запуске Java HelloWorld выход:

HelloWorld Java: символ ошибки поиска:. $/libhelloworld.so: не определено символ: _ZN13hellouniverseC1Ev

Я надеюсь, что вы можете помочь мне с моей проблемой :-)

ответ

0

Вы должны связать hellouniverse материал в библиотеку. Например

g++ -fPIC -shared -I$JAVA_PATH/include -I$JAVA_PATH/include/linux/ -o libhelloworld.so hellworld.cpp hellouniverse.cpp 

Или

g++ -fPIC -I $JAVA_PATH/include -I$JAVA_PATH/include/linux -c helloworld.cpp 
g++ -fPIC -I $JAVA_PATH/include -I$JAVA_PATH/include/linux -c hellouniverse.cpp 
g++ -fPIC -shared -o libhelloworld.so helloworld.o hellouniverse.o 

Рассмотрите возможность использования Makefile, чтобы автоматизировать этот процесс.

Смежные вопросы