2

これは 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 ファイルから生成されたこのネイティブ 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);

この実行時エラーが発生します:

スレッド「メイン」の例外 java.lang.UnsatisfiedLinkError: Native.initiate(I)V

_JAVA_initiate の名前を JAVA_initiate と NATIVE_initiate と _JAVA_NATIVE_inititation と JAVA_NATIVE_inititation に変更しようとしましたが、それでも機能しませんでした

ライブラリは完全に正常にロードされています.ネイティブメソッドを呼び出している間、リンクエラーが発生しています.

編集: 以下は、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
4

2 に答える 2

0

javah使用している関数には多くのものが欠けているため、関数のシグネチャを生成するためにを使用する必要があります。特に、すべての関数に引数として渡されるJNI環境。

于 2012-11-06T13:09:01.920 に答える
0

通常、クラスにはパッケージがあり、これはメソッド名の一部であるNative.hを使用して生成したもので宣言されたメソッドを実装する必要があります。javah

于 2012-11-06T13:09:16.913 に答える