2015-03-19 80 views
0

我在为C++做JNI教程,并且能够成功构建。但是,当我尝试运行时,出现此错误弹出窗口“无法启动程序C:... \ CLibHelloWorld.dll”。 资源教程我也跟着为: http://electrofriends.com/articles/jni/jni-part1-java-native-interface/ http://electrofriends.com/articles/jni/part-2-jni-visual-studio-setup-dll-project/由于.dll(JNI)无法启动程序

我做得不对我这里的.dll配置?我确实改变了我的“附加包含目录”,并且我的Java正在工作,因为我能够将java.class文件编译为.header文件。

我编译ClibHelloWorld.h文件

/* 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.cpp是:

#include "HelloWorld.h" 
#include "jni.h" 
#include "stdio.h" 

JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj) 
{ 
    printf("Hello world\n"); 
    return; 
} 
+0

无法启动程序?我希望只有在尝试将DLL作为应用程序启动时才会出现这样的消息。你的命令行是什么启动你的测试程序? – user2543253 2015-03-19 10:30:16

+0

我刚刚编译,构建并运行在Visual Studio 2013最终,然后我得到这个错误 – 2015-03-20 14:32:17

+0

Visual Studio只能建立DLL。你不能运行一个DLL。我将写这个答案。 – user2543253 2015-03-20 15:53:59

回答

0

您不能运行的DLL。为了“运行”一个JNI DLL,你还需要一个使用该DLL的Java程序。你的情况可能是这样

public static void main(String argv[]) { 
    new HelloWorld().print(); 
} 

Java运行时会检测到“打印”是一个本地方法,将加载DLL和调用的函数那里。为了能够从Visual Studio中调试DLL,最好的选择是在VS项目属性的“调试”部分输入“java”调用。 (也可以将VS调试器附加到正在运行的Java进程中,但通常在完成之前就会完成简短的程序)

JNI是一种使Java和本机平台代码之间可以进行接口的技术。一种用法是从Java调用(通常)C代码。这就是你的教程所做的。另一个用途是从C调用Java代码。这有点复杂,还有其他教程介绍如何做到这一点,但只有在这种情况下,您才能构建一个EXE,Visual Studio可以“刚刚开始”。

+0

我已经有这个Java程序。但是当我执行“java HelloWorld”时出现了一个错误,它无法检测到我的dll。我能够构建它 – 2015-03-23 03:47:22

+0

有大量的文章解释了如何让Java找到本机库。在java调用中使用'-Djava.library.path = '来传递包含该DLL的目录。 (如果你不是从命令行调用java,而是将java调用放入Visual Studio项目属性中,则可以使用VS变量来获取构建DLL的正确目录。) – user2543253 2015-03-23 10:22:08

+0

这不是很有帮助所有。我解决了我自己的错误。 – 2015-03-24 01:45:31

0

我认为这段代码只是.dll,它会在父Debug文件夹中生成一个.dll文件。

创建一个HelloWorld.java并使用javac将它编译成一个.class文件 然后使用javah创建一个头文件。 然后在命令提示符下运行“java HelloWorld”来运行该程序并在java程序中加载用C++编写的代码

相关问题