0

我正在使用 JNI 从 C++ 访问 Java 类,但每当我在我的 java 文件中调用某个方法时FindClass总是返回(参见 java 代码)。nil当我删除呼叫时,它可以正常工作。

./testjnisamplecode

结果:graph = new OrientGraphNoTx(odb);在java代码中......

No !

结果:没有graph = new OrientGraphNoTx(odb);在java代码中......

Yes !

Initializing graph .. 

Java使用命令行,它工作正常:

java -cp "/mypath/orientdb/debug/orientdb-c/lib/*:." Inserter

结果:

Initializing graph .. 
Initialized ok ..

C++

#include <string.h>
#include <stdio.h>
#include <jni.h>

void main()
{

  JavaVM *vm;
  JNIEnv *env;
  JavaVMInitArgs vm_args;

  JavaVMOption opts[2];
  opts[0].optionString = "-Djava.class.path=/mypath/orientdb/debug/orientdb-c:/mypath/orientdb/debug/orientdb-c/lib:/mypath/orientdb/debug/orientdb-c/lib/blueprints-core-2.5.0-SNAPSHOT.jar:/mypath/orientdb/debug/orientdb-c/lib/blueprints-orient-graph-2.5.0-SNAPSHOT.jar:.";
  opts[1].optionString = "-verbose:jni";   

  vm_args.version = JNI_VERSION_1_2;
  vm_args.nOptions = 0;
  vm_args.ignoreUnrecognized = 1;

  jmethodID mid;
  jint square;

  // Construct a VM
  jint res = JNI_CreateJavaVM(&vm, (void **)&env, &vm_args);

  // First get the class that contains the method you need to call
  jclass clazz = (*env)->FindClass(env, "Inserter");

  // TEST IF CLASS WAS FOUND
  if (clazz) {
    printf("Yes !\n");
  }
  else {
    printf("No !\n");
    exit(1);
  }

  // get init method
  jmethodID init = (*env)->GetMethodID(env, clazz, "<init>",
                                 "()V");

}

爪哇

import java.io.IOException;

import com.tinkerpop.blueprints.impls.orient.OrientGraphNoTx;
import com.orientechnologies.orient.core.db.graph.OGraphDatabase;
import com.tinkerpop.blueprints.TransactionalGraph;
//import com.tinkerpop.blueprints.impls.orient.OrientGraph;

import java.util.List;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import com.orientechnologies.orient.core.metadata.schema.OType;

public class Inserter
{
    private OGraphDatabase odb;
    private OrientGraphNoTx graph;

    public Inserter() 
    {
        System.out.println("Initializing graph .. ");

        odb = new OGraphDatabase("local:/home/vagrant/orientdb-graphed-1.5.1/databases/sitepoint-ruby-demo").open("admin","admin");

        //graph = new OrientGraphNoTx(odb);    // <----- THIS BREAKS C++ CODE

        //System.out.println("Initialized ok .. ");

    }

    public static void main(String[] args)
    {
        Inserter ins = new Inserter();
    }
}

我怎样才能解决这个问题???任何想法?

4

1 回答 1

0

我认为错过了类路径中的 orientdb jar,蓝图 api 还不够,您还需要包含 orient-commons.jar 和 orientdb-core.jar(blueprints-orient-graph 依赖项)

再见

于 2013-10-10T15:34:30.550 回答