gpt4 book ai didi

Java 无法在 OSX 上使用 JNI 加载共享对象库

转载 作者:太空狗 更新时间:2023-10-29 16:13:15 24 4
gpt4 key购买 nike

我试图在我 friend 的 64 位 OSX 上使用 JNI 以最简单的方式加入 Java 和 C,但我收到了这个错误。以下是所有相关内容:

测试.java

public class test {

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

native void aaa ();

public static void main (String [] args) {
new test ();
}

public test () {
aaa ();
}
}

测试.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class test */

#ifndef _Included_test
#define _Included_test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: test
* Method: aaa
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_test_aaa
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

测试.c

#include <stdio.h>
#include <jni.h>
#include "test.h"

JNIEXPORT void JNICALL Java_test_aaa
(JNIEnv *env, jobject obj) {
printf ("AWD");
}

生成文件

CC          =   gcc
CFLAGS = -Wall -ansi -pedantic -g3

default :
javac test.java
javah -jni test
gcc -c test.c -o test.o -I${HOME}/../../System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/
gcc -shared -Wl,-install_name,libtest.so -o libtest.so test.o

我必须使用 -install_name 而不是 -soname,因为我读到 OSX 没有像 Linux 那样的 -soname。

然后我做

export LD_LIBRARY_PATH=.
java test

我明白了

Exception in thread "main" java.lang.UnsatisfiedLinkError: no test in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1856)
at java.lang.Runtime.loadLibrary0(Runtime.java:845)
at java.lang.System.loadLibrary(System.java:1084)
at test.<clinit>(test.java:2)

所以我真的不知道是什么问题。我将所有文件复制到 Linux 上并将 -install_name 切换为 -soname 并将路径更改为 jni.h,它工作得很好。

最佳答案

在 OS X 上,JNI 查找具有扩展名 .jnilib 的库,或具有 .dylib 的标准 OS X 共享库扩展名的库。

来源:http://developer.apple.com/library/mac/#documentation/Java/Conceptual/Java14Development/05-CoreJavaAPIs/CoreJavaAPIs.html

关于Java 无法在 OSX 上使用 JNI 加载共享对象库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14905361/

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