キャメロンミアーズ:
私は、C言語でネイティブのリストを作る++とJavaでそれを使用しようとしています私はすべての権利宣言されているかなり確信しているが、私はリンクエラーを取得しています
Javaの例外:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Java_List.init_list(Ljava/lang/Object;)J
at Java_List.init_list(Native Method)
at Java_List.main(Java_List.java:13)
Javaソース
public class Java_List
{
static
{
System.loadLibrary("JAVA_JNI_FTC");
}
public native long init_list(Object a);
public static void main(String[] args)
{
Java_List list = new Java_List();
System.out.println(list.init_list(list));
}
}
ヘッダファイル
#include <jni.h>
#include "List.h"
#include <new>
#ifndef _Included_JAVA_LIST
#define _Included_JAVA_LIST
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJNI
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT jlong JNICALL Java_Java_List_init_list(JNIEnv *, jobject, jobject);
JNIEXPORT jobject JNICALL Java_Java_List_list_get(JNIEnv *env, jobject thisObj, jint index, jlong list);
#ifdef __cplusplus
}
#endif
typedef struct Java_List Java_List;
struct Java_List
{
void *list;
jclass type;
};
void init_Java_List(Java_List *jList, jclass type);
jobject java_list_get(Java_List *jList, int index);
#endif
C ++ソース
#include <jni.h>
#include "Java_List.h"
#include "pch.h"
extern "C"
{
JNIEXPORT jlong JNICALL Java_Java_List_init_list(JNIEnv *env, jobject thisObj, jobject classType)
{
jclass type = env->GetObjectClass(classType);
Java_List *list = (Java_List *)malloc(sizeof(Java_List));
init_Java_List(list, type);
return (jlong)list;
}
JNIEXPORT jobject JNICALL Java_Java_List_list_get(JNIEnv *env, jobject thisObj, jint index, jlong list)
{
return java_list_get((Java_List *)list, (int)index);
}
}
/* jni api*/
void init_Java_List(Java_List *jList, jclass type)
{
jList->list = malloc(sizeof(List<jobject>));
new (jList->list) List<jobject>();
jList->type = type;
}
jobject java_list_get(Java_List *jList, int index)
{
List<jobject> *list = (List<jobject> *) jList->list;
return *(list->get(index));
}
私はこのプロジェクトのためのVisual Studioを使用しています、このプロジェクトはただのdll、私はこの場合問題を知らないではない複数のファイルを作成します。ファイル
マイケル:
あなたのJavaクラス名とメソッド名が命名規則に反するアンダースコアが含まれています。
あなたがそれらを保つことを主張した場合、あなたはあなたにC ++関数の名前を変更する必要がありますJava_Java_1List_init_1list
。なお、1
前秒List
とlist
リテラルアンダースコア文字の代わりの命名セパレータとして先行アンダースコアを解釈するようにリンカーに指示します。