我制作了 .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:
我删除了一些信息,因为它们不是英文的。但是由于我留下了错误代码,我想识别原因和情况没有问题。