gpt4 book ai didi

java loadlibrary和native方法声明

转载 作者:行者123 更新时间:2023-11-30 06:28:38 25 4
gpt4 key购买 nike

简而言之:显然,必须在发出 loadLibrary 调用的同一个类中声明 native 方法。如果在静态内部类中声明 native 方法,则绑定(bind)失败。

工作示例:

public class TestNative
{
public TestNative()
{
System.loadLibrary( "mylibrary");
}

private native int nativeMethod();

public void doit()
{
new NativeWrap().callNative();
}

class NativeWrap
{
int callNative()
{
return nativeMethod(); // <<<< works
}
}
}

失败示例:

public class TestNative2
{
public TestNative2()
{
System.loadLibrary( "mylibrary");
}

public void doit()
{
new NativeWrap().callNative();
}

static class NativeWrap
{
int callNative()
{
return nativeMethod(); // <<<< throws UnsatisfiedLinkError
}

private native int nativeMethod();
}
}

顺便说一句:loadLibrary 在两个示例中都有效。

我没有找到有关此主题的任何提示。我发现的所有 JNI 示例都将库加载到与声明 native 方法相同的类中。有人可以解释一下这个东西吗?

最佳答案

它工作得很好。加载库的位置并不重要。这里重要的是方法的名称。如果您生成方法签名,然后将方法移到其他地方,它将无法运行。

看这里:

package recipeNo001;

public class HelloWorld {

static {
System.loadLibrary("HelloWorld");
}

private native void displayMessage();

static class NativeWrapper {
void callNative() {
displayMessageInner();
}
private native void displayMessageInner();
}

public static void main(String[] args) {
new HelloWorld().displayMessage();
new NativeWrapper().callNative();
}
}

但是您必须确保在库内提供正确的名称。注意两者之间的区别:

JNIEXPORT void JNICALL Java_recipeNo001_HelloWorld_displayMessage
(JNIEnv *env, jclass obj)
JNIEXPORT void JNICALL Java_recipeNo001_HelloWorld_00024NativeWrapper_displayMessageInner
(JNIEnv *env, jobject obj)

当然,它有效。

Hello world from enclosing class!
Hello world from wrapper!

而且,就您而言,您还有另一个问题。如果您不在静态 block 中加载库,则必须确保在调用 native 方法之前至少实例化该类的一个对象。

看看这里的示例代码:

https://github.com/mkowsiak/jnicookbook/tree/master/recipes/recipeNo034

关于java loadlibrary和native方法声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46585850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com