java JNI 可以在没有文件的情况下加载原生函数吗?
Can java JNI load native funciton without file?
我想知道如何编写一个 java 程序来从自身加载本机函数。
我只想使用 lib 中的简单本机函数(原始数据存储在 java 代码中)。
通常加载native是这样的,会从文件系统加载lib:
public class HelloJNI {
static {
System.loadLibrary("hello"); // Load native library hello.dll (Windows) or libhello.so (Unixes)
}
private native void sayHello();
public static void main(String[] args) {
new HelloJNI().sayHello();
}
}
但是出于某种原因,我只想使用一个 .java 文件来执行此操作。例如,我将 java 中的“libhello.so”写入文件并加载它:
public class HelloJNI {
public static native void sayHello();
public static void main(String[] args) throws Exception{
FileOutputStream fos = new FileOutputStream("./libhello.so");
fos.write(Base64.getDecoder().decode("base64encode of libhello.so"));
fos.close();
System.load(System.getProperty("user.dir")+"/libhello.so");
new HelloJNI().sayHello();
}
}
由于我将程序中的数据写入文件并加载我刚刚写入的文件只是为了使用“System.load()”,我想知道我是否可以只从程序加载而不是写入文件和加载它。
你基本上是在问你是否可以调用你控制的内存中的任意代码。这在技术上是可行的……JVM 的 JIT 编译器一直在这样做。但我认为您至少需要一个通过标准机制加载的本机库才能开始。据我所知,无法直接从 Java 执行此操作,因此此时我认为您首先需要一个基本的 JNI 库来提供所需的挂钩。
巴拿马项目可能会改变这一点,请参阅:https://github.com/openjdk/panama-foreign/blob/foreign-jextract/doc/panama_ffi.md
我想知道如何编写一个 java 程序来从自身加载本机函数。 我只想使用 lib 中的简单本机函数(原始数据存储在 java 代码中)。
通常加载native是这样的,会从文件系统加载lib:
public class HelloJNI {
static {
System.loadLibrary("hello"); // Load native library hello.dll (Windows) or libhello.so (Unixes)
}
private native void sayHello();
public static void main(String[] args) {
new HelloJNI().sayHello();
}
}
但是出于某种原因,我只想使用一个 .java 文件来执行此操作。例如,我将 java 中的“libhello.so”写入文件并加载它:
public class HelloJNI {
public static native void sayHello();
public static void main(String[] args) throws Exception{
FileOutputStream fos = new FileOutputStream("./libhello.so");
fos.write(Base64.getDecoder().decode("base64encode of libhello.so"));
fos.close();
System.load(System.getProperty("user.dir")+"/libhello.so");
new HelloJNI().sayHello();
}
}
由于我将程序中的数据写入文件并加载我刚刚写入的文件只是为了使用“System.load()”,我想知道我是否可以只从程序加载而不是写入文件和加载它。
你基本上是在问你是否可以调用你控制的内存中的任意代码。这在技术上是可行的……JVM 的 JIT 编译器一直在这样做。但我认为您至少需要一个通过标准机制加载的本机库才能开始。据我所知,无法直接从 Java 执行此操作,因此此时我认为您首先需要一个基本的 JNI 库来提供所需的挂钩。
巴拿马项目可能会改变这一点,请参阅:https://github.com/openjdk/panama-foreign/blob/foreign-jextract/doc/panama_ffi.md