0

我制作了 .c 文件以在 JNI 中使用。.java、.h、.c 并且编译得很好:D 我的环境是 Windows 7 64 位。

但是,我面临的问题是关于另一个外部库。我收到了一个由一个头文件和一个库文件组成的库。我所做的如下。

I. 将 XXX.h 和 XXX.lib 复制到原始 JNI 文件所在的同一物理目录中。就我而言:C:\Users\JY\worspace\Test\org\owls\src\jni\现在我有这些文件:

  • 原始文件:

    • IIS.java

    • IIS.class

    • 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 *.

三、cl通过 VS2012 x64 Native Tools 命令提示符使用命令编译。命令行是:

cl IIS.c -Feiis.dll -LD -MD
cl IIS.c -Feiis.dll -LD -MD -link XXX.lib

四。现在问题来了。通常,如果添加头文件成功,则调用在该头文件中声明的函数是没有问题的。但就我而言,有一个错误。症状如下。

  • 只是添加头文件不会导致编译器错误(编译成功。)

  • 使用在头文件中声明的函数会导致链接器错误 (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

0

您需要告诉链接器 in 可以查看 XXX.lib 以获取它需要链接的任何函数。它不会仅仅因为该文件位于您的项目目录中而这样做。

一种方法是在某个被编译的源文件中,比如在IIS.c,之后#include "XXX.h"

#pragma comment(lib, "XXX.lib")

请参阅此MS 知识库文章

于 2013-09-11T22:56:57.973 回答