JNI で使用する .c ファイルを作成しました。.java、.h、.c と適切にコンパイル:D 私の環境は Windows 7 64 ビットです。
ただし、私が直面している問題は、別の外部ライブラリに関するものです。1 つのヘッダー ファイルと 1 つの lib ファイルで構成されるライブラリを受け取りました。私がしたことは以下です。
I. XXX.h と XXX.lib を元の JNI ファイルと同じ物理ディレクトリにコピーします。私の場合:C:\Users\JY\worspace\Test\org\owls\src\jni\
そして今、私はそこにこれらのファイルを持っています:
元のファイル:
IIS.java
IIS.クラス
org_owls_jni_IIS.h
IIS.c
新しく追加された:
XXX.h
XXX.lib
Ⅱ.ディレクティブ#include "XXX.h"
を .c ファイルに追加しました。したがって、IIS.c は次のようになります。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "org_owls_jni_IIS.h"
#include "XXX.h"
JNIEXPORT jint JNICALL Java_org_owls_jni_IIS_doIIS
(JNIEnv* env, jobject jobj, jstring jtarget, jstring jdest, jstring jimage){
jboolean iscp;
int video_len = 0;
char* a = "aaa";
const char* ctarget = (*env)->GetStringUTFChars(env, jtarget, &iscp);
const char* cdest = (*env)->GetStringUTFChars(env, jdest, &iscp);
const char* cimage = (*env)->GetStringUTFChars(env, jimage, &iscp);
fprintf(stderr, "VIDEO [ %s ] THUMBNAIL [ %s ]\n", ctarget, cdest);
sprintf(tmp, "C : %s\t%s", ctarget, cdest);
fprintf(stderr, "%s\n", tmp);
Call_XXX(a);
(*env)->ReleaseStringUTFChars(env, jtarget, ctarget);
(*env)->ReleaseStringUTFChars(env, jdest, cdest);
(*env)->ReleaseStringUTFChars(env, jimage, cimage);
return (jint)video_len;
}
Call_XXX()
は XXX.h で定義されており、引数の型を受け取りますchar *
。
III. cl
VS2012 x64 ネイティブ ツール コマンド プロンプト経由でコマンドを使用してコンパイルします。コマンドラインは次のとおりです。
cl IIS.c -Feiis.dll -LD -MD
cl IIS.c -Feiis.dll -LD -MD -link XXX.lib
IV. ここで問題が発生します。通常、ヘッダーファイルの追加に成功すれば、そのヘッダーで宣言されている関数を呼び出しても問題ありません。しかし、私の場合、エラーがあります。症状は以下。
ヘッダー ファイルを追加するだけでは、コンパイル エラーにはなりません (コンパイルは成功します)。
ヘッダー ファイルで宣言されている関数を使用すると、リンカー エラー (LNK2019) が発生します。
エラー メッセージは次のとおりです。
IIS.c
Microsoft (R) Incremental Linker Version 11.00.50727.1
Copyright (C) Microsoft Corporation. All rights reserved.
/out:iis.dll
/dll
/implib:iis.lib
IIS.obj
iis.lib 라이브러리 및 iis.exp 개체를 생성하고 있습니다.
IIS.obj : error LNK2019:Call_XXX 외부 기호(참조 위치: Java_org_owls_jni_IIS_doIIS 함수)에서 확인하지 못했습니다.
iis.dll : fatal error LNK1120:
一部のメッセージは英語ではないため、削除しました。ただ、エラーコードは残してあるので、原因や状況の把握には問題ないと思います。