gpt4 book ai didi

java - 从 Java 运行 native dll 时线程 "main"java.lang.UnsatisfiedLinkError : Native. initiate(I)V 中的异常

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:58:51 26 4
gpt4 key购买 nike

这是 Native.cpp :

// Native.cpp : Defines the exported functions for the DLL application.
//
#include "stdafx.h"
#define ALLEGRO_NO_MAGIC_MAIN
#include <stdio.h>
#include <string>
#include <windows.h>
#include "generic_interface.h"
#include "NativeC.h"

using namespace std;

// Some useful defines I liked from Sun's stuff
#define JNIEXPORT __declspec(dllexport)
#define JNICALL __cdecl
#define jint long


typedef ExportedClass* (__cdecl *exported_class)();
HINSTANCE temptDLL;
ExportedClass** importedClasses;
char** classNamePerIndex;
int libraryLength = 0;

JNIEXPORT void JNICALL _JAVA_initiate(HNative *self, jint libraryLength) {
importedClasses = new ExportedClass*[libraryLength];
classNamePerIndex = new char*[libraryLength];
}

实现并加载从上述 Native.cpp 文件生成的 native dll 的 Java 类如下:

public class Native {
// guess?
native public void initiate(int libraryLength);


// Loads the file Native.DLL at run-time
static {
System.loadLibrary("Native");
}

// Constructor
public Native()
{
}

}

但是在调用的时候

(new Native()).initiate(1);

我得到这个运行时错误:

线程“main”中的异常 java.lang.UnsatisfiedLinkError: Native.initiate(I)V

我试图将 _JAVA_initiate 重命名为 JAVA_initiate 和 NATIVE_initiate 以及 _JAVA_NATIVE_inititate 甚至 JAVA_NATIVE_inititate,但它仍然没有用

库加载完全正常,只是在调用 native 方法时出现链接错误。

编辑:下面列出的是已经包含在 Native.cpp 中的 NativeC.h

/*  DO NOT EDIT - automatically generated by javah  */
#include "Native.h"

/* Header for class Native */

#ifndef _Included_Native
#define _Included_Native

typedef struct ClassNative {
#pragma pack(push,4)
int32_t MSReserved;
struct Hjava_lang_String * string_;
/*boolean*/ long boolean_;
/*byte*/ long byte_;
/*char*/ long char_;
double double_;
float float_;
long int_;
int64_t long_;
/*short*/ long short_;
struct Hjava_lang_String * w;
long x;
long y;
#pragma pack(pop)
} ClassNative;
#define HNative ClassNative

#ifdef __cplusplus
extern "C" {
#endif
__declspec(dllexport) void __cdecl _JAVA_initiate (struct HNative *, long);
__declspec(dllexport) void __cdecl _JAVA_loadLibraryAndInitiate (struct HNative *, struct Hjava_lang_String *);
__declspec(dllexport) long __cdecl _JAVA_evaluateLibrary (struct HNative *, struct Hjava_lang_String *, struct Hjava_lang_String *);
#ifdef __cplusplus
}
#endif
#endif

最佳答案

您需要使用 javah 为您的函数生成签名,因为您正在使用的函数缺少很多东西。特别是 JNI 环境,它作为参数传递给每个函数。

关于java - 从 Java 运行 native dll 时线程 "main"java.lang.UnsatisfiedLinkError : Native. initiate(I)V 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13251682/

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