EDIT3:这是导致问题的编译器标志,如果我使用Microsoft的编译器从命令行编译它可以正常工作。有没有人知道我需要更改code :: blocks来解决这个问题?
当我运行我的代码时,我得到一个UnsatisfiedLinkError。加载步骤工作正常,我在实际调用代码时收到错误。
开始使用我的dll路径
java -Djava.library.path=E:\Java\JNIHellowWorld\PasswordGenHW\bin\Debug -jar dist\JNIHellowWorld.jar
例外
Exception in thread "main" java.lang.UnsatisfiedLinkError: jnihellowworld.Main.HelloWorld()Ljava/lang/String;
at jnihellowworld.Main.HelloWorld(Native Method)
at jnihellowworld.Main.main(Main.java:16)
Java代码
package jnihellowworld;
import java.io.IOException;
public class Main {
public native String HelloWorld() throws Error;
public static void main(String[] args) throws IOException {
try
{
System.loadLibrary("PasswordGenHW");
String test = new Main().HelloWorld(); //errors on this line
System.out.println(test);
System.in.read();
}
catch(Exception e)
{
e.printStackTrace();
}
}
}
C ++标题
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class jnihellowworld_Main */
#ifndef _Included_jnihellowworld_Main
#define _Included_jnihellowworld_Main
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: jnihellowworld_Main
* Method: HelloWorld
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_jnihellowworld_Main_HelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
C ++ cpp
#include "jnihellowworld_Main.h"
#include <jni.h>
JNIEXPORT jstring JNICALL Java_jnihellowworld_Main_HelloWorld
(JNIEnv *env, jobject obj)
{
return env->NewStringUTF("Hello world!");
}
我使用Code :: Blocks和GCC来编译dll。
编辑:这是dll的dumpbin / exports
2 1 000011D8 Java_jnihellowworld_Main_HelloWorld@8
EDIT2:使用system.loadLibrary()复制错误的简化项目
答案 0 :(得分:0)
尝试在编译和链接上添加这些标志:
-Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at
示例:
gcc -c -Wall -D_JNI_IMPLEMENTATION_ -Wl,--kill-at test.c
gcc -shared -D_JNI_IMPLEMENTATION_ -Wl,--kill-at test.o -o mylib.dll
答案 1 :(得分:0)
我最终只是使用微软的编译器手工编译。