JNI:为简单的 HelloWorld 程序获取 java.lang.UnsatisfiedLinkError
Posted
技术标签:
【中文标题】JNI:为简单的 HelloWorld 程序获取 java.lang.UnsatisfiedLinkError【英文标题】:JNI : Getting java.lang.UnsatisfiedLinkError for simple HelloWorld Program 【发布时间】:2015-07-06 14:01:02 【问题描述】:我使用的是 Linux (Ubuntu 12.10)。我已经在 SO 上尝试了this 问题以及网络上的许多其他问题,但我无法解决我的问题。
这里是java文件:
class HelloWorld
public native void display();
static
System.loadLibrary("HelloWorld");
public static void main(String args[])
HelloWorld hw = new HelloWorld();
hw.display();
我使用javac HelloWorld.java
编译它。
然后我使用javah -jni HelloWorld
从.class
文件创建了头文件。我得到了这个头文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C"
#endif
/*
* Class: HelloWorld
* Method: display
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_display
(JNIEnv *, jobject);
#ifdef __cplusplus
#endif
#endif
在此之后,我创建了以下 C 文件:
#include <stdio.h>
#include "HelloWorld.h"
void display();
int main()
display();
return 0;
void display()
printf("Hello World Naveen\n");
并使用gcc -o libHelloWorld.so -fPIC -lc -shared -I/usr/lib/jvm/java-6-oracle/include/ -I/usr/lib/jvm/java-6-oracle/include/linux HelloWorld.c
编译。
然后我做了echo $LD_LIBRARY_PATH=.
。但是当我运行java HelloWorld
时,我得到UnsatisfiedLinkError
【问题讨论】:
【参考方案1】:您的HelloWorld.c
文件不应包含main
或display
。相反,它应该包含HelloWorld.display
方法的实现。例如:
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_display (JNIEnv * env, jobject obj)
printf ("Hello World\n");
【讨论】:
【参考方案2】:您在 C 文件中的本机函数实现必须与生成的方法签名相匹配。
使用
JNIEXPORT void JNICALL Java_HelloWorld_display(JNIEnv * env, jobject obj)
没有
void display()
【讨论】:
以上是关于JNI:为简单的 HelloWorld 程序获取 java.lang.UnsatisfiedLinkError的主要内容,如果未能解决你的问题,请参考以下文章
Android JNI编程——JNI概念以及C语言Dev-C++开发环境搭建编写HelloWorld
JNI/NDK开发指南—— JNI开发流程及HelloWorld