Java中调用c/c++语言出现Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V...错误

时间:2023-02-26 20:38:42

错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V
at Test.testPrint(Native Method)
at Test.main(Test.java:8)

解决方法:

昨天一天都在想办法解决这个问题,操作步骤按照教程来的,怎么会出错呢?
想了半天,觉得还是dll文件生成的不对。所以,最后决定把codeblocks换成visual c++来编译生成dll文件,最后一试成功了。

------------------------------我是分割线----------------------------------------------------------------------------------------------------------------

Java中如何调用c/c++

1、首先打开eclipse,新建一个eclipse工程,编写一个java类。

如下所示:

public class Test {
public native void testPrint(String str);//1

public static void main(String[] args){
System.loadLibrary("TestAgain");//2

Test test = new Test();
test.testPrint("this is a test");
}

}

分析这个程序,1处使用native关键字申明了一个本地方法,这个方法我们在后面要用c/c++实现

2处则是在java中通过libname:TestAgain加载本地方法库。

这里可以使用System.loadLibrary("xxx");//xxx是生成的dll文件的名字加载本地方法库,也可以通过System.load("E:/eclipseWork/Test/TestAgain.dll")来加载本地方法库,load方法里面需要填写绝对路径。

2、然后使用 javac -d . Test.java 生成类文件

3、再使用 javah -jni Test 生成.h文件

生成的.h文件如下

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Test */

#ifndef _Included_Test
#define _Included_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Test
* Method: testPrint
* Signature: (Ljava/lang/String;)V//1
*/
JNIEXPORT void JNICALL Java_Test_testPrint
(JNIEnv *, jobject, jstring); //2

#ifdef __cplusplus
}
#endif
#endif

这个和我们平常的.h文件没有什么差别,都是用来申明函数的,不过它是机器自动生成的,所以不要修改。

1处,是一个标记符,当从本地方法端访问java端的时候就会用到。

java类型 Signature 备注
boolean Z  
byte B  
char C  
short S  
int I  
long L  
float F  
double D  
void V  
object L用/分割的完整类名 例如: Ljava/lang/String表示String类型
Array [签名 例如: [I表示int数组, [Ljava/lang/String表示String数组
Method (参数签名)返回类型签名 例如: ([I)I表示参数类型为int数组, 返回int类型的方法

(表格摘自http://www.cnblogs.com/icejoywoo/archive/2012/02/22/2363709.html)

2处是函数申明,我们在c/c++中需要实现

4、用visual c++新建一个dll工程。test.h文件中包含#include <jni.h>,包含的jni.h存在于JDK安装目录下的include下面。需要将他们添加进来。

Tools->Options->Directories,新建Directions。

Java中调用c/c++语言出现Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V...错误

再就是用c/c++实现本地方法,注意.c/.cpp中的函数名必须和.h中的函数名一致

下面是.cpp的代码

#include "windows.h"
#include "Test.h"
#include "iostream.h"
/*
* Class: Test
* Method: testPrint
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_Test_testPrint(JNIEnv * env, jobject obj, jstring str){
const char *msg;
msg = env->GetStringUTFChars(str,0);
cout<<"the msg is"<<endl;
cout<<msg<<endl;
env->ReleaseStringUTFChars(str,msg);
}

5、编译通过生成TestAgain.dll。将它复制到之前建的eclipse工程根目录下面

Java中调用c/c++语言出现Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V...错误

6、回到eclipse界面,F5刷新工程,然后run。结果如下

Java中调用c/c++语言出现Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V...错误

这样就实现了在Java中调用c/c++。

Java中调用c/c++语言出现Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V...错误的更多相关文章

  1. idea中使用scala运行spark出现Exception in thread &quot&semi;main&quot&semi; java&period;lang&period;NoClassDefFoundError&colon; scala&sol;collection&sol;GenTraversableOnce&dollar;class

    idea中使用scala运行spark出现: Exception in thread "main" java.lang.NoClassDefFoundError: scala/co ...

  2. &lbrack;Scala&rsqb; java使用scala的jar包问题&colon;Exception in thread &quot&semi;main&quot&semi; java&period;lang&period;ClassCastException&colon; java&period;lang&period;Integer cannot be cast to java&period;lang&period;Short

    场景 刚写的scala处理bmp文件的实验, 打了jar包让java调用一下, 结果发生这个错误. package org.tanglizi.bmp.demo; import org.tanglizi ...

  3. Exception in thread &quot&semi;main&quot&semi; java&period;lang&period;OutOfMemoryError&colon; Java heap space

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space解决方法 问题描述 Exception ...

  4. 在dos中运行java程序,若出现Exception in thread &OpenCurlyDoubleQuote;main&quot&semi; java&period;lang&period;NoClassDefFoundError

    在dos中运行java程序,若出现Exception in thread “main" java.lang.NoClassDefFoundError,可以检查一下几项: 环境变量配置: 注意 ...

  5. CentOS6&period;5 静默安装Oracle 11g过程中提示:Exception in thread &OpenCurlyDoubleQuote;main” java&period;lang&period;NoClassDefFoundError

    原来是系统中设置了DISPLAY环境变量,执行: [oracle@qa26 database]$ ./runInstaller  -silent -responseFile /usr/local/or ...

  6. GUI学习中错误Exception in thread &quot&semi;main&quot&semi; java&period;lang&period;NullPointerException

    运行时出现错误:Exception in thread "main" java.lang.NullPointerException 该问题多半是由于用到的某个对象只进行了声明,而没 ...

  7. Exception in thread &quot&semi;main&quot&semi; java&period;lang&period;NoClassDefFoundError&colon; UDP&lowbar;Receive &lpar;wrong na me&colon; com&sol;ray&sol;net&sol;UDP&lowbar;Receive&rpar;

    一.事件经过 今晚学习java网络编程,在eclipse中写了两个个java文件,一个发送端UDP_Send2.java,一个接收端UDP_Receive.java.实现发送端键盘录入信息,通过UDP ...

  8. nutch爬取时Exception in thread &OpenCurlyDoubleQuote;main” java&period;io&period;IOException&colon; Job failed&excl;

    用cygwin运行nutch 1.2爬取提示IOException: $ bin/nutch crawl urls -dir crawl -depth 3 -topN 10 crawl started ...

  9. 编译运行java程序出现Exception in thread &quot&semi;main&quot&semi; java&period;lang&period;UnsupportedClassVersionError&colon; M &colon; Unsupported major&period;minor version 51&period;0

    用javac编译了一个M.java文件, 然后用java M执行,可是出现了下面这个错误. Exception in thread "main" java.lang.Unsuppo ...

随机推荐

  1. fir&period;im Weekly - Stanford 的 Swift 课程来了

    上周提过,Swift 的 Github 主页上已经有了 >>「Port to Android」,这周重点推荐一下 Stanford 的 Swift 课程. Developing iOS 9 ...

  2. AngularJs &dollar;compile编译服务与指令

    $compile 这是个编译服务.编译一段HTML字符串或者DOM的模板, 产生一个将scope和模板连接到一起的函数. 编译服务主要是为指令编译DOM元素,下面的一大段也是主要介绍指令的. 下面是一 ...

  3. nginx、php-fpm、mysql用户权限解析

    nginx本身不能处理PHP,它只是个web服务器.当接收到客户端请求后,如果是php请求,则转发给php解释器处理,并把结果返回给客户端.如果是静态页面的话,nginx自身处理,然后把结果返回给客户 ...

  4. &lbrack;MySQL&rsqb; 两个优化数据库表的简单方法--18&period;3

    这里介绍两个简单的优化MySQL数据库表的方法 一.定期分析表和检查表 1.分析表语法如下: alalyze [local|no_write_to_binlog] table table_name1[ ...

  5. bzoj3339 bzoj3585

    两题本质是一样,只不过3585要离散化这种不修改,不强制的问题,显然先考虑离线算法这道题的思路和bzoj1878非常像考虑到如果只是求每个前缀的mex,我们是很容易扫一遍就得出来的我们设为这个位置的m ...

  6. 虚拟机安装centos

    linux安装 鉴于国内大多数服务器都使用的redhat系列作为操作系统,centos又是redhat的免费版本,所以可以学习一下.因为另一台古董电脑已经装了linuxmint,虽然也可以安装虚拟机, ...

  7. 关于mysql运行效率优化注意事项及要点

    1. SQL优化的原则是:将一次操作须要读取的BLOCK数减到最低,即在最短的时间达到最大的数据吞吐量. 调整不良SQL通常能够从下面几点切入: ? 检查不良的SQL,考虑其写法是否还有可优化内容 ? ...

  8. Java Web 获取客户端真实IP

    Java Web 获取客户端真实IP 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP.一般分为两种情况: 方 ...

  9. Javascript 自动执行函数(立即调用函数)

    开头:各种原因总结一下javascript中的自动执行函数(立即调用函数)的一些方法,正文如下 在Javascript中,任何function在执行的时候都会创建一个执行上下文,因为function声 ...

  10. java多线程小题一瞥

    有如下线程类定义: public class MyThread extends Thread { private static int num = 0; public MyThread() { num ...