System.loadLibrary 在 Java 中不再作为包的一部分工作
System.loadLibrary not working anymore as part of package in Java
我想在 Java 中运行的 Apache Spark 中使用现有的 C++ 代码。我使用 SWIG 生成 JNI 接口,只要我从一个简单的 class 调用函数,就像这样 (MyJavaClass.java):
public class MyJavaClass {
public static void main(String[] args) {
System.loadLibrary("mycppcode");
mycppcode.dostuff();
}
}
然后我尝试将 class 集成到我需要能够从 Spark 调用它的打包层次结构中 (MyJavaClass.java):
package com.mycompany.mypackage;
public class MyJavaClass {
public void MyJavaMethod() {
System.loadLibrary("mycppcode");
mycppcode.dostuff();
}
}
但是当我在文件上添加 package 行时,当 运行 javac 时出现以下错误:
MyJavaClass.java:6: error: cannot find symbol
mycppcode.dostuff();
^
symbol: variable mycppcode
location: class MyJavaClass
1 error
我使用以下命令生成 JNI、libmycppcode.so 库和 Java class:
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++ 文件 (mycppcode.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();
}
}
我刚开始工作。非常感谢@Michael 提供 -package 参数的提示。
问题似乎是我试图从 class 文件的实际文件夹中 运行 javac 像这样:
~/myproject/src/com/mycompany/mypackage$ javac MyJavaClass.java
相反,javac 需要从根源目录执行,如下所示:
~/myproject/src$ javac com/mycompany/mypackage/MyJavaClass.java
我不确定为什么,但这可以防止错误。
如 here 所述,您不能在 com.mycompany.mypackage 中使用默认包中的 class。我的 JavaClass。你应该重命名 mycppcode class:
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();
}
}
我想在 Java 中运行的 Apache Spark 中使用现有的 C++ 代码。我使用 SWIG 生成 JNI 接口,只要我从一个简单的 class 调用函数,就像这样 (MyJavaClass.java):
public class MyJavaClass {
public static void main(String[] args) {
System.loadLibrary("mycppcode");
mycppcode.dostuff();
}
}
然后我尝试将 class 集成到我需要能够从 Spark 调用它的打包层次结构中 (MyJavaClass.java):
package com.mycompany.mypackage;
public class MyJavaClass {
public void MyJavaMethod() {
System.loadLibrary("mycppcode");
mycppcode.dostuff();
}
}
但是当我在文件上添加 package 行时,当 运行 javac 时出现以下错误:
MyJavaClass.java:6: error: cannot find symbol
mycppcode.dostuff();
^
symbol: variable mycppcode
location: class MyJavaClass
1 error
我使用以下命令生成 JNI、libmycppcode.so 库和 Java class:
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++ 文件 (mycppcode.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();
}
}
我刚开始工作。非常感谢@Michael 提供 -package 参数的提示。
问题似乎是我试图从 class 文件的实际文件夹中 运行 javac 像这样:
~/myproject/src/com/mycompany/mypackage$ javac MyJavaClass.java
相反,javac 需要从根源目录执行,如下所示:
~/myproject/src$ javac com/mycompany/mypackage/MyJavaClass.java
我不确定为什么,但这可以防止错误。
如 here 所述,您不能在 com.mycompany.mypackage 中使用默认包中的 class。我的 JavaClass。你应该重命名 mycppcode class:
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();
}
}