MAC OS JNI java.lang.UnsatisfiedLinkError Native方法

时间:2013-06-20 17:10:29

标签: macos operating-system java-native-interface unsatisfiedlinkerror

JNI例程在Wintel上运行正常,但是在MAC OS上编译时,c ++“Native Method”调用会导致java.lang.UnsatisfiedLinkError本地方法

库加载,符号表似乎正确,rpath名称更改已经引入.....

简化为简单的HelloWorld,但仍然没有运气。

---系统----

macossys:~ rvc $ uname -a
Darwin macossys 12.4.0 Darwin Kernel Version 12.4.0: Wed May  1 17:57:12 PDT 2013; root:xnu-2050.24.15~1/RELEASE_X86_64 x86_64

---- StackTrace:----

macossys:build rvc$ java -Djava.library.path=./bin -classpath ./bin/Bifrost.jar com.nvidia.bifrost.NVbClientTest
Jun 18, 2013 8:50:40 PM com.nvidia.bifrost.NVbClientTest main
WARNING: RVC NVbClient System.getProperty("java.io.tmpdir"):/var/folders/kn/gff3dgh96yv8hmpz1j_ytmk0_nxsrd/T/
Jun 18, 2013 8:50:40 PM com.nvidia.bifrost.NVbClientTest main
WARNING: RVC NVbClient System.getProperty("java.library.path"):./bin
Jun 18, 2013 8:50:40 PM com.nvidia.bifrost.NVbClientTest main
WARNING: RVC NVbClient System.getenv("PATH"):/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin
Jun 18, 2013 8:50:40 PM com.nvidia.bifrost.NVbClientTest main
INFO:      RVC NVbClient System.loadedLibrary:
/Library/Java/JavaVirtualMachines/jdk1.7.0_21.jdk/Contents/Home/jre/lib/libzip.dylib
/Users/rvc/perForceWorkSpace/p4/sw/gcomp/dev/src/BifrostClientSDK/build/bin/libBifrost.dylib
/Users/rvc/perForceWorkSpace/p4/sw/gcomp/dev/src/BifrostClientSDK/build/bin/libBifrostJNI.dylib

Jun 18, 2013 8:50:40 PM com.nvidia.bifrost.NVbClientTest main
INFO: RVC NVbClient before tester.play()
Jun 18, 2013 8:50:40 PM com.nvidia.bifrost.NVbClientTest play
INFO: RVC play serverName:10.31.193.163 Port:443
NVbClient helloWorldPrintFromJni before helloWorldPrint
Exception in thread "main" java.lang.UnsatisfiedLinkError: com.nvidia.bifrost.NVbClient.helloWorldPrint()I
at com.nvidia.bifrost.NVbClient.helloWorldPrint(Native Method)          “This basically says a problem with JVM finding Native Method Signature”
at com.nvidia.bifrost.NVbClient.helloWorldPrintFromJni(NVbClient.java:141)
at com.nvidia.bifrost.NVbClientTest.play(NVbClientTest.java:88)
at com.nvidia.bifrost.NVbClientTest.main(NVbClientTest.java:61)

----- rpath引用似乎正确:-----

macossys:build rvc$ otool -L -arch all bin/libBifrostJNI.dylib
bin/libBifrostJNI.dylib:
@rpath/libBifrostJNI.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libBifrost.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 47.1.0)
/usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 47.1.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 744.19.0)
/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
macossys:build rvc$ otool -L -arch all bin/libBifrost.dylib
bin/libBifrost.dylib:
@rpath/libBifrost.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 47.1.0)
/usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 47.1.0)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 744.19.0)
/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 56.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0)
macossys:build rvc$

----符号存在:-----

macossys:build rvc$ nm -g sdk/jsrc/jni/CMakeFiles/BifrostJNI.dir/NVbClientJNI.cpp.o | grep -i hello
0000000000001160 T _Java_com_nvidia_bifrost_NVbClient_helloWorldPrint
0000000000001af0 S _Java_com_nvidia_bifrost_NVbClient_helloWorldPrint.eh

---- 32位或64位:----

macossys:bin rvc$ file libBifrostJNI.dylib
libBifrostJNI.dylib: Mach-O 64-bit dynamically linked shared library x86_64
macossys:bin rvc$ file libBifrost.dylib
libBifrost.dylib: Mach-O 64-bit dynamically linked shared library x86_64

-----基本代码参考---- ^^^^ Java电话:

// Used ot verify JNI stack.
int nvbResultR = m_client.helloWorldPrintFromJni();     
m_logger.info("RVC after m_client.helloWorldPrint():"+nvbResultR);

^^^ Java JNI方法调用/定义:

public int helloWorldPrintFromJni()
{
System.out.println("NVbClient helloWorldPrintFromJni before helloWorldPrint");
int rtVal = helloWorldPrint();
System.out.println("NVbClient helloWorldPrintFromJni after helloWorldPrint");     
return rtVal;
}

/** Get the current session ID. */
private native int helloWorldPrint();

^^^ c ++ JNI标题和方法签名:

extern "C" JNIEXPORT jint JNICALL Java_com_nvidia_bifrost_NVbClient_helloWorldPrint (JNIEnv *, jobject);

extern "C"
JNIEXPORT jint JNICALL Java_com_nvidia_bifrost_NVbClient_helloWorldPrint(JNIEnv *env, jobject thiz) 
{ 
printf("Made it Java_com_nvidia_bifrost_NVbClient_HelloWorld_print\n"); 
jint result = 1;
return result;
}

-----通过cmake改变路径:

ADD_CUSTOM_COMMAND(TARGET Bifrost POST_BUILD    
COMMAND ${NAME_TOOL} -id @rpath/libBifrost.dylib ${BIN_DIR}/libBifrost.dylib        
COMMAND ${NAME_TOOL} -change ${BIN_DIR}/libBifrost.dylib @rpath/libBifrost.dylib ${BIN_DIR}/libBifrost.dylib               
)

0 个答案:

没有答案