JNI - 创建另一个C ++类的实例

时间:2014-12-12 07:47:30

标签: java c++ object java-native-interface

我有一个旧的应用程序(C ++),我想通过JNI用java调用它。 所以我阅读了一些教程和基础知识(用Java调用C ++中的方法)非常有效。

但现在我的问题是我想在JNI使用的方法中实例化另一个C ++对象。这主要是不可能的,还是有办法做到这一点?

解释:

这是我的Java-Class 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

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

和hellouniverse.cpp:

g ++ -c -o hellouniverse.o hellouniverse.cpp

当我运行java helloworld时,输出为:

的HelloWorld java:符号查找错误:$。/ libhelloworld.so:未定义符号:_ZN13hellouniverseC1Ev

我希望你能解决我的问题: - )

1 个答案:

答案 0 :(得分: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自动执行此操作。