gpt4 book ai didi

找不到 C 头文件中定义的函数(JNI)

转载 作者:行者123 更新时间:2023-11-30 17:48:00 24 4
gpt4 key购买 nike

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

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

我。将 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 * 参数类型。

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

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:

我删除了一些消息,因为这些消息不是英文的。但既然我留下了错误代码,我想识别原因和情况是没有问题的。

最佳答案

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

一种方法是在某些已编译的源文件中,例如在 IIS.c 中,在 #include "XXX.h"

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

查看此MS Knowledge Base article .

关于找不到 C 头文件中定义的函数(JNI),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18733295/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com