gpt4 book ai didi

java - Eclipse插件,调用C++ dll

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:23:54 24 4
gpt4 key购买 nike

我有一个自己构建的 Eclipse 插件,我需要在其中调用 C++ dll。

我试着分两步来做到这一点:1. 在我的 Eclipse 插件之外通过调用 C++ dll 的 Java 主程序2.尝试把它放到我的插件中(这是问题所在)

  1. 在 Eclipse 插件之外。

主要 Java 代码 HelloWorld.java。

class HelloWorld {
//public native void print(); //native method
public native String print(String msg); //native method

static //static initializer code
{
System.loadLibrary("CLibHelloWorld");
}

public static void main(String[] args)
{
//HelloWorld hw = new HelloWorld();
//hw.print();

String result = new HelloWorld().print("Hello from Java");

System.out.println("In Java, the returned string is: " + result);
}
}

通过命令编译:"C:\Program Files\Java\jdk1.6.0_34\bin\javac"HelloWorld.java

然后我通过以下方式为 C++ dll 制作了一个 h 文件 HelloWorld.h:

"C:\Program Files\Java\jdk1.6.0_34\bin\javah"HelloWorld

h 文件看起来像这样:

#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: print
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_HelloWorld_print
(JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

现在 C++ dll CLibHelloWorld.cpp :

#include "HelloWorld.h"
#include "jni.h"
#include "stdafx.h"
#include "tchar.h"

#import "..\ManagedVBDLL\bin\Debug\ManagedVBDLL.tlb" raw_interfaces_only
using namespace ManagedVBDLL;

JNIEXPORT jstring JNICALL Java_HelloWorld_print(JNIEnv *env, jobject thisObj, jstring inJNIStr) {
jboolean blnIsCopy;
const char *inCStr;
char outCStr [128] = "string from C++";

inCStr = env->GetStringUTFChars(inJNIStr, &blnIsCopy);
if (NULL == inCStr) return NULL;

printf("In C, the received string is: %s\n", inCStr);
env->ReleaseStringUTFChars(inJNIStr, inCStr);

return env->NewStringUTF(outCStr);
}

构建dll

当我运行 java 主程序时...一切正常!

  1. 试着把它放到我的 Eclipse 插件中(这就是问题所在)

我创建了一个应该调用 C++ dll 的类:

package org.eclipse.ui.examples.recipeeditor.support;
import org.eclipse.jface.dialogs.MessageDialog;

public class HelloWorld {
public native String print(String msg); //native method

static //static initializer code
{
try {
System.loadLibrary("CLibHelloWorld"); //$NON-NLS-1$
} catch (Exception e) {
e.printStackTrace();
MessageDialog.openInformation(null, "HelloWorld", "HelloWorld Catch: " + e.getMessage());
}
}
}

然后这样调用它:

HelloWorld hw = new HelloWorld();
result = hw.print("Hi from Eclipse");

然后我在 hw.print 上得到这个错误(dll 的加载完成):

java.lang.UnsatisfiedLinkError: org.eclipse.ui.examples.recipeeditor.support.HelloWorld.print(Ljava/lang/String;)Ljava/lang/String;

说来话长,但我该如何解决呢?

谢谢。

最佳答案

System.loadLibrary 仅在 LD_LIBRARY_PATH (Linux) 或 PATH (Windows) 中可用时加载库。您还需要尊重正确的名称。在 windows 中不确定,但在 linux 中,如果你正在加载 CLibHelloWorld 像你一样,你的 DLL 应该被称为 libCLibHelloWorld.so 。我想有一个 System.getNativeMethodName 或类似的东西,所以您可以找到它。

无论如何,这不是我首选的加载 DLL 的方式,因为您依赖于很多环境设置。相反,您可以使用 System.load (dll_full_path) 加载您的 DLL。它具有相同的效果,但您有更多的控制权。

但是,如果您使用此方法成功加载 DLL,并且在尝试调用 native 方法时不断出现上述错误,请查看 DLL 依赖项。您应该先加载依赖项,然后再加载您要调用的库。

例如,如果你想加载dll1,它依赖于dll2,而dll2又依赖于dll3,你应该这样做:

System.load(dll3_path);
System.load(dll2_path);
System.load(dll1_path);

关于java - Eclipse插件,调用C++ dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13321945/

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