有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

C++系统。loadLibrary不再作为Java包的一部分工作

我想在爪哇运行的Apache Spk中使用已经存在的C++代码。我使用SWIG生成JNI接口,只要我从这样一个简单的类(MyJavaClass.java)调用函数,它就会像一个魔咒一样工作:

public class MyJavaClass {
  public static void main(String[] args) {
    System.loadLibrary("mycppcode");
    mycppcode.dostuff();
  }
}

然后我尝试将该类集成到我的打包层次结构中,我需要能够从Spark(MyJavaClass.java)调用它:

package com.mycompany.mypackage;

public class MyJavaClass {
  public void MyJavaMethod() {
    System.loadLibrary("mycppcode");
    mycppcode.dostuff();
  }
}

但是,当我添加行时,在文件上运行javac时,我得到了以下错误:

MyJavaClass.java:6: error: cannot find symbol
        mycppcode.dostuff();
        ^
  symbol:   variable mycppcode
  location: class MyJavaClass
1 error

我使用以下命令生成JNI,即libmycpp代码。所以库和Java类:

swig -c++ -java -package com.mycompany.mypackage mycppcode.i
g++ -fpic -c mycppcode.cpp mycppcode_wrap.cxx -std=c++17 -I/usr/lib/jvm/java-8-openjdk-amd64/include -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux
g++ -shared mycppcode.o mycppcode.o -o libmycppcode.so
javac MyJavaClass.java

这是C++文件(MyCPppCord.CPP):

#include <iostream>
using namespace std;

int dostuff() {
    cout << "Hello World!" << endl;
}

这是接口文件(mycppcode.i):

%module mycppcode
%{
extern int dostuff();
%}
extern int dostuff();

这是生成的JNI文件(mycppcodeJNI.java):

package com.mycompany.mypackage

public class mycppcodeJNI {
  public final static native int dostuff();
}

这是生成的Java文件(mycppcode.Java):

public class mycppcode {
  public static int dostuff() {
    return mycppcodeJNI.dostuff();
  }
}

共 (2) 个答案

  1. # 1 楼答案

    正如here所解释的,您不能在com中使用默认包中的类。我的公司。我的包裹。MyJavaClass。您应该重命名mycppcode类:

    package com.mycompany.mypackage;
    
    public class mycppcode {
      public static int dostuff() {
        return mycppcodeJNI.dostuff();
      }
    }
    

    实际上,它可以使用任何包名,例如

    package jni;
    
    public class mycppcode {
      public static int dostuff() {
        return mycppcodeJNI.dostuff();
      }
    }
    
  2. # 2 楼答案

    我刚开始工作。非常感谢@Michael对-package参数的提示

    问题似乎是我试图从类文件的实际文件夹运行javac,如下所示:

    ~/myproject/src/com/mycompany/mypackage$ javac MyJavaClass.java
    

    相反,javac需要从根源目录执行,如下所示:

    ~/myproject/src$ javac com/mycompany/mypackage/MyJavaClass.java
    

    我不知道为什么,但这可以防止错误