我想创建一个简单的JNI层。我使用Visual Studio 2008创建了一个dll(带有DLL作为选项的Win 32 Console
Application项目类型)。我在调用本地方法时收到此异常:
Exception occurred during event dispatching:
java.lang.UnsatisfiedLinkError: com.tpd.vcdba.console.TaskScheduler.vcdbaTaskSch
edulerNative.Hello()V
at com.tpd.vcdba.console.TaskScheduler.vcdbaTaskSchedulerNative.Hello(Na
tive Method)
at com.tpd.vcdba.console.TaskScheduler.vcdbaTaskSchedulerUtil.isTaskExis
ts(vcdbaTaskSchedulerUtil.java:118)
at com.tpd.vcdba.console.Dialogs.schedulerWizardPage.scheduleTaskPage.wz
Finish(scheduleTaskPage.java:969)
at com.tpd.vcdba.console.wizard.vcdbaWizard.gotoFinish(vcdbaWizard.java:
434)
at com.tpd.vcdba.console.wizard.wzActionPanel.actionPerformed(wzActionPa
nel.java:163)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
生成的头文件是:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_tpd_vcdba_console_TaskScheduler_vcdbaTaskSchedulerNative */
#ifndef _Included_com_tpd_vcdba_console_TaskScheduler_
vcdbaTaskSchedulerNative
#define _Included_com_tpd_vcdba_console_TaskScheduler_
vcdbaTaskSchedulerNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_tpd_vcdba_console_TaskScheduler_vcdbaTaskSchedulerNative
* Method: Hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_tpd_vcdba_console_TaskScheduler_vcdbaTaskSchedulerNative_Hello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
实现文件是:
#pragma once
#include "com_tpd_vcdba_console_TaskScheduler_
vcdbaTaskSchedulerNative.h"
#include "stdafx.h"
#include "jni.h"
/*
* Class: com_tpd_vcdba_console_TaskScheduler_vcdbaTaskScheduler_native
* Method: Hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_tpd_vcdba_console_TaskScheduler_vcdbaTaskSchedulerNative_Hello
(JNIEnv *envs, jobject obj){
printf("hello world");
}
Java文件是:
package com.tpd.vcdba.console.TaskScheduler;
import com.tpd.vcdba.console.TaskScheduler.ScheduleTask;
public class vcdbaTaskSchedulerNative {
public native void Hello();
private static vcdbaTaskSchedulerNative instance = null;
static{
try{
System.loadLibrary("JNITrial");
}
catch(Exception ex){
}
}
public vcdbaTaskSchedulerNative(){
}
public static vcdbaTaskSchedulerNative getInstance(){
if(instance == null){
instance = new vcdbaTaskSchedulerNative();
}
return instance;
}
}
当我调用本地方法“ Hello”时,我得到执行。
我观察到的另一件事是,当我使用以下命令在命令行中进行编译时:“ cl -I” C:\ Program Files(x86)\ Java \ jdk1.7.0
\ include“ -I” C:\ Program Files(x86)\ Java \ jdk1.7.0 \ include \ win32“ -LD”
C:\ Users \ administrator.RMDOM \ Documents \ Visual Studio 2008 \ Projects \
JNITrial \ JNITrial \ JNIInt.cpp“ -FeJNITrial.dll”,一切正常。
我是否在Visual Studio设置中缺少某些内容?我有使用MFC的选项作为“在共享DLL中使用MFC”,有的代码生成选项为“多线程DLL(/
MD)”。它是一个64位dll。还有什么需要补充的吗?
欢迎任何帮助。提前致谢。
我想出了解决方案。
我的项目使用了预编译头选项集,因此编译器跳过了以下语句:
#include "com_tpd_vcdba_console_TaskScheduler_vcdbaTaskSchedulerNative.h"
一旦我删除了该选项,它就像魔术一样工作。
我在stackoverflow上四处寻找类似的问题,但我找到的解决方案似乎都不适合我。我在一台Linux /Ubuntu机器上。我只是在练习JNI,但我发现了这个错误: 我提供了我的 .c、.h 和 .java文件。 .java文件: .c文件: .h 文件: 我使用这些命令生成. h文件,编译/生成. so文件,然后运行: JAVACnativetest.java javah-jni nativ
我有一个JNI dll以及我在带有eclipse的机器上创建的jar文件。 我正在尝试将其部署到另一台机器,但无法通过异常 我有另一个打印java.library.path的程序,我已经验证了这个dll所依赖的dll以及这个dll在java.library.path. 我已经阅读了他们应该在当前目录中的帖子,但这不起作用。 我读过他们应该去jre/bin的帖子,得到了同样的结果。 任何帮助都将不胜
我遵循这个指南: http://docs.opencv.org/doc/tutorials/introduction/android_binary_package/dev_with_OCV_on_Android.html 但我仍然得到这个错误: E/AndroidRuntime(916):java.lang.未满足链接错误:无法从加载器加载opencv_java248dalvik.system.P
我试图编写一个简单的Java程序,通过JNI调用C函数来打印“Hello World”。一切编译都没有错误,但当我运行程序时,我得到一个“UnsatisfiedLinkError:找不到依赖库”。 根据Dependency Walker和dumpbin的说法,唯一的依赖项是“kernel32.dll”,在C:\Windows\System32及其依赖项中,也在System32中。 使命感 返回时没
我试图从java调用一个使用C样式字符串的C函数。当我使用C风格的字符串时,程序执行得很好,但正如我声明std::string时,不知何故,它再也找不到依赖库了。我在eclipse环境中检查了includes文件夹,它确实包含 这是我的本地文件: 这段代码可以很好地从java编译并运行良好,但只要我尝试使用std::string版本(注释),代码就会编译并创建动态库,但在运行java代码时,我会遇
我刚从下载了Tess4Jhttp://tess4j.sourceforge.net/并将其导入到netbeans中。我遵循这个url,我正确地遵循了每一步,但当我尝试执行时,我得到了下面的错误。 错误: 我搜索并发现人们建议更新到 Visual Visual Studio 2013 的可再发行组件包,我做了,但事实证明没有帮助,我仍然遇到同样的问题。我不知道我做错了什么,下面是我的代码。 代码: