【发布时间】:2013-12-02 23:21:22
【问题描述】:
我正在学习 JNI。 我创建了一个简单的 java 类:
package asd.jni;
public class PrintJNI {
public native String print();
static{
try{
System.out.println("loading libPrint");
System.load("C:/DeLauri/WorkSpaceC_CPP/Print2/Debug/libPrint.dll");
System.out.println("libPrint loaded");
}catch(UnsatisfiedLinkError e){
System.out.println("error "+e.toString());
e.printStackTrace();
}
}
}
手动调用 javah -jni 我创建 asd_jni_PrintJNI.h:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class asd_jni_PrintJNI */
#ifndef _Included_asd_jni_PrintJNI
#define _Included_asd_jni_PrintJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: asd_jni_PrintJNI
* Method: print
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_asd_jni_PrintJNI_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
在 Eclipse CDT 中,我创建了一个名为“Print”的 C 项目,并在其中创建了一个 Print.c:
#include <jni.h>
#include <stdio.h>
#include "asd_jni_PrintJNI.h"
JNIEXPORT jstring JNICALL Java_asd_jni_PrintJNI_print (JNIEnv *env, jobject obj) {
printf("aasdasdadasd");
const char rtn[10] = "Hello \n";
printf("aasdasdadasd");
return (*env)->NewStringUTF(env, rtn);
}
一切都编译成功,但是当我运行我的主类时: 包装 asd;
import asd.jni.PrintJNI;
public class StartPrintJNI {
/**
* @param args
*/
public static void main(String[] args) {
try{
PrintJNI print = new PrintJNI();
System.out.println("call");
String cStrg = print.print();
System.out.println("called");
System.out.println(cStrg);
}catch(UnsatisfiedLinkError e){
System.out.println("error in main "+e.toString());
e.printStackTrace();
}catch(Exception e){
System.out.println("2 "+ e.getMessage());
e.printStackTrace();
}
}
}
我有以下错误:
loading libPrint
libPrint loaded
call
error in main java.lang.UnsatisfiedLinkError: asd/jni/PrintJNI.print()Ljava/lang/String;
java.lang.UnsatisfiedLinkError: asd/jni/PrintJNI.print()Ljava/lang/String;
at asd.StartPrintJNI.main(StartPrintJNI.java:16)
有人可以帮助我吗? 谢谢
更新:我正在使用 Eclipse/Eclipse CDT IDE 中的 MinGW 在 Windows 7 上进行这些测试
【问题讨论】:
-
你检查你的 DLL 导出的函数名了吗?您可以使用dependencywalker.com 来查看它。很可能你的名字被弄错了。
-
这是一个好问题!DLL 文件的名称是 libPrint.dll 但我不确定 dll 中的函数名称是否正确。我不能在我工作的电脑上安装这个软件,但我会在谷歌上找到如何查看里面的 dll 文件。
-
如果我通过eclipse CDT浏览dll生成的文件,我找到了一个名为_Java_asd_jni_PrintJNI_print@8()的方法
标签: java c eclipse java-native-interface eclipse-cdt