尝试编译基本 JNI 测试代码时 VS2010 出错
Error in VS2010 when trying to compile basic JNI Test Code
我正在尝试编译一个基本的 JNI 测试以准备一个 DLL(使用 headers 和 lib 文件)我希望在接下来的几天内收到,我需要为它创建一个 JNI 接口.
我试过将它指向 JNI.lib 的 x64/x86 库。我试过根本不将它指向 lib。我已经尝试将它指向包含目录的两个 x64/x86 版本,但它总是与下面相同的错误。
Visual Studio 给我以下错误,我不知道为什么:
1>------ Build started: Project: CLibHelloWorld, Configuration: Debug Win32 ------
1>Build started 04/03/2015 19:04:09.
1>InitializeBuildStatus:
1> Creating "Debug\CLibHelloWorld.unsuccessfulbuild" because "AlwaysCreate" was specified.
1>ClCompile:
1> CLibHelloWorld.c
1>Link:
1> Creating library F:\Work-Companies\DigitalARCSystems\KlearKapture\CameraInterface\test\test-jni\Debug\CLibHelloWorld.lib and object F:\Work-Companies\DigitalARCSystems\KlearKapture\CameraInterface\test\test-jni\Debug\CLibHelloWorld.exp
1> test-jni.vcxproj -> F:\Work-Companies\DigitalARCSystems\KlearKapture\CameraInterface\test\test-jni\Debug\CLibHelloWorld.dll
1>FinalizeBuildStatus:
1> Deleting file "Debug\CLibHelloWorld.unsuccessfulbuild".
1> Touching "Debug\CLibHelloWorld.lastbuildstate".
1>
1>Build succeeded.
1>
1>Time Elapsed 00:00:00.43
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
HelloWorld.java(用javac编译HelloWorld.java):
class HelloWorld {
public native void print(); //native method
static //static initializer code
{
System.loadLibrary("CLibHelloWorld");
}
public static void main(String[] args)
{
HelloWorld hw = new HelloWorld();
hw.print();
}
}
HelloWorld.h(由 javah -jni HelloWorld 生成):
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
CLibHelloWorld.c:
#include "HelloWorld.h"
#include "jni.h"
#include "stdio.h"
JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
printf("Hello world\n");
return;
}
将评论转化为答案,因为它显然有助于解决问题。
调查 MSBuild 问题的一种方法是查看详细日志。在 VS 命令提示符下,cd 到项目目录,然后执行命令 msbuild MyProject.vcxproj /v:d
。这将构建详细的详细级别。在输出中搜索链接器命令,您应该会看到类似
的内容
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\link.exe /OUT:"c:\my_output_path\myfile.dll" ...
链接器的 /OUT 选项就是您所追求的。如果根本不调用链接器,则您有一些不需要为项目生成二进制文件的设置。
我正在尝试编译一个基本的 JNI 测试以准备一个 DLL(使用 headers 和 lib 文件)我希望在接下来的几天内收到,我需要为它创建一个 JNI 接口.
我试过将它指向 JNI.lib 的 x64/x86 库。我试过根本不将它指向 lib。我已经尝试将它指向包含目录的两个 x64/x86 版本,但它总是与下面相同的错误。
Visual Studio 给我以下错误,我不知道为什么:
1>------ Build started: Project: CLibHelloWorld, Configuration: Debug Win32 ------
1>Build started 04/03/2015 19:04:09.
1>InitializeBuildStatus:
1> Creating "Debug\CLibHelloWorld.unsuccessfulbuild" because "AlwaysCreate" was specified.
1>ClCompile:
1> CLibHelloWorld.c
1>Link:
1> Creating library F:\Work-Companies\DigitalARCSystems\KlearKapture\CameraInterface\test\test-jni\Debug\CLibHelloWorld.lib and object F:\Work-Companies\DigitalARCSystems\KlearKapture\CameraInterface\test\test-jni\Debug\CLibHelloWorld.exp
1> test-jni.vcxproj -> F:\Work-Companies\DigitalARCSystems\KlearKapture\CameraInterface\test\test-jni\Debug\CLibHelloWorld.dll
1>FinalizeBuildStatus:
1> Deleting file "Debug\CLibHelloWorld.unsuccessfulbuild".
1> Touching "Debug\CLibHelloWorld.lastbuildstate".
1>
1>Build succeeded.
1>
1>Time Elapsed 00:00:00.43
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========
HelloWorld.java(用javac编译HelloWorld.java):
class HelloWorld {
public native void print(); //native method
static //static initializer code
{
System.loadLibrary("CLibHelloWorld");
}
public static void main(String[] args)
{
HelloWorld hw = new HelloWorld();
hw.print();
}
}
HelloWorld.h(由 javah -jni HelloWorld 生成):
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
CLibHelloWorld.c:
#include "HelloWorld.h"
#include "jni.h"
#include "stdio.h"
JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
printf("Hello world\n");
return;
}
将评论转化为答案,因为它显然有助于解决问题。
调查 MSBuild 问题的一种方法是查看详细日志。在 VS 命令提示符下,cd 到项目目录,然后执行命令 msbuild MyProject.vcxproj /v:d
。这将构建详细的详细级别。在输出中搜索链接器命令,您应该会看到类似
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\link.exe /OUT:"c:\my_output_path\myfile.dll" ...
链接器的 /OUT 选项就是您所追求的。如果根本不调用链接器,则您有一些不需要为项目生成二进制文件的设置。