0

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. clVS2012 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: 

一部のメッセージは英語ではないため、削除しました。ただ、エラーコードは残してあるので、原因や状況の把握には問題ないと思います。

4

1 に答える 1