Java中调用c/c++语言出现Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V...错误
错误:
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。

再就是用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工程根目录下面

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

这样就实现了在Java中调用c/c++。
Java中调用c/c++语言出现Exception in thread "main" java.lang.UnsatisfiedLinkError: Test.testPrint(Ljava/lang/String;)V...错误的更多相关文章
- idea中使用scala运行spark出现Exception in thread "main" java.lang.NoClassDefFoundError: scala/collection/GenTraversableOnce$class
idea中使用scala运行spark出现: Exception in thread "main" java.lang.NoClassDefFoundError: scala/co ...
- [Scala] java使用scala的jar包问题:Exception in thread "main" java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Short
场景 刚写的scala处理bmp文件的实验, 打了jar包让java调用一下, 结果发生这个错误. package org.tanglizi.bmp.demo; import org.tanglizi ...
- Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space解决方法 问题描述 Exception ...
- 在dos中运行java程序,若出现Exception in thread “main" java.lang.NoClassDefFoundError
在dos中运行java程序,若出现Exception in thread “main" java.lang.NoClassDefFoundError,可以检查一下几项: 环境变量配置: 注意 ...
- CentOS6.5 静默安装Oracle 11g过程中提示:Exception in thread “main” java.lang.NoClassDefFoundError
原来是系统中设置了DISPLAY环境变量,执行: [oracle@qa26 database]$ ./runInstaller -silent -responseFile /usr/local/or ...
- GUI学习中错误Exception in thread "main" java.lang.NullPointerException
运行时出现错误:Exception in thread "main" java.lang.NullPointerException 该问题多半是由于用到的某个对象只进行了声明,而没 ...
- Exception in thread "main" java.lang.NoClassDefFoundError: UDP_Receive (wrong na me: com/ray/net/UDP_Receive)
一.事件经过 今晚学习java网络编程,在eclipse中写了两个个java文件,一个发送端UDP_Send2.java,一个接收端UDP_Receive.java.实现发送端键盘录入信息,通过UDP ...
- nutch爬取时Exception in thread “main” java.io.IOException: Job failed!
用cygwin运行nutch 1.2爬取提示IOException: $ bin/nutch crawl urls -dir crawl -depth 3 -topN 10 crawl started ...
- 编译运行java程序出现Exception in thread "main" java.lang.UnsupportedClassVersionError: M : Unsupported major.minor version 51.0
用javac编译了一个M.java文件, 然后用java M执行,可是出现了下面这个错误. Exception in thread "main" java.lang.Unsuppo ...
随机推荐
- 【Android】SlidingMenu属性详解(转)
原文:http://my.eoe.cn/1169143/archive/21892.html SlidingMenu简介:SlidingMenu的是一种比较新的设置界面或配置界面效果,在主界面左滑或者 ...
- MATLAB学习笔记(五)——MATLAB绘图
(一)二维数据曲线图 一.绘制单根二维曲线 1.基本调用格式 plot(x,y) (1)x,y为长度相同的向量,分别用于储存x坐标和y坐标数据 (2)用于绘制以x,y为横,纵坐标的二维曲线. (3)举 ...
- GC日志介绍
每一种收集器的日志形式都是由它们自身的实现所决定的,换而言之,每个收集器的日志格式都可以不一样.但虚拟机设计者为了方便用户阅读,将各个收集器的日志都维持一定的共性,例如以下两段典型的GC日志: 33. ...
- BZOJ1845 : [Cqoi2005] 三角形面积并
求出所有交点后从左往右扫描线,用每段的中位线去截所有三角形,算出长度并后乘以该段长度即可,时间复杂度$O(n^3\log n)$. #include<cstdio> #include< ...
- BZOJ2093 : [Poi2010]Frog
从左往右维护两个指针l,r表示离i最近的k个点的区间,预处理出每个点出发的后继,然后倍增. #include<cstdio> typedef long long ll; const int ...
- Guaranteeing message processing —— 可靠的消息处理
Storm's reliability API: how Storm guarantees that every message coming off a spout will be fully pr ...
- HDU1853 & 蜜汁建图+KM模板
题意: 给你一个N个点M条边的带权有向图,现在要你求这样一个值:该有向图中的所有顶点正好被1个或多个不相交的有向环覆盖.这个值就是 所有这些有向环的权值和. 要求该值越小越好. SOL: 本来还想ta ...
- css3中的几何图形shape研究
前言 估计大家在日常工作中都会用到css形状,但是目前天朝中使用到最多的估计就是圆(circle).椭圆(ellipse).各种三角形形状,但是你肯定很少看见过用几何图形或者多边图形.假如你不懂什么叫 ...
- 在线代码格式化,在线JSON校验格式化
在线代码格式化 http://tool.oschina.net/codeformat/json 在线JSON校验格式化 http://www.kjson.com/ 两个好用工具
- 【wikioi】1907 方格取数3(最大流+最大权闭合子图)
http://www.wikioi.com/problem/1907/ 这题我一开始想到的是状压,看到n<=30果断放弃. 然后也想到了黑白染色,然后脑残了,没想到怎么连边. 很简单的一题 黑白 ...