当.java .class .h .c文件都在同一个目录下时我JAVA调C测试通过。可是当我JAVA文件带包路径时编译都挺顺利,就是最后一步执行java程序会报java.lang.UnsatisfiedLinkError异常。详情如下:
1.CalculatePriceRangeTest.java(当作运行启动类用的)
package com.mezimedia.mq;
public class CalculatePriceRangeTest
{
public static void main(String[] args)
{
SmarterCDMTemp smCDM = new SmarterCDMTemp();
smCDM.calculatePriceRange(1);
}
}2.SmarterCDMTemp.java(native方法在此类声明)
package com.mezimedia.mq;
public class SmarterCDMTemp
{
static
{
System.load("/home/datateam/SmarterMQFE1/src/com/mezimedia/mq/libSmarterCDMTemp.so");
}
public void calculatePriceRange(int ChannelID)
{
System.out.println( "1" ); calculatePriceRange(""+ChannelID); System.out.println( "2" ); System.exit(0);
} public native static void calculatePriceRange(String ChannelID);
}3.com_mezimedia_mq_SmarterCDMTemp.h(生成的.h文件)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_mezimedia_mq_SmarterCDMTemp */#ifndef _Included_com_mezimedia_mq_SmarterCDMTemp
#define _Included_com_mezimedia_mq_SmarterCDMTemp
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_mezimedia_mq_SmarterCDMTemp
* Method: calculatePriceRange
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_mezimedia_mq_SmarterCDMTemp_calculatePriceRange
(JNIEnv *, jclass, jstring);#ifdef __cplusplus
}
#endif
#endif4.SmarterCDMTemp.c(.c程序)
#include <stdio.h>
#include "/usr/include/mysql/mysql.h"
#include "com_mezimedia_mq_SmarterCDMTemp.h"JNIEXPORT void JNICALL Java_com_mezimedia_mq_SmarterCDMTemp_calculatePriceRange(JNIEnv * env, jclass cls, jstring str)
{
printf("perfect\n");
}我的操作步骤如下:
1.javac -d /home/datateam/SmarterMQFE1/build/classes com/mezimedia/mq/SmarterCDMTemp.java
2.javac -d /home/datateam/SmarterMQFE1/build/classes com/mezimedia/mq/CalculatePriceRangeTest.java3.javah -jni -d com/mezimedia/mq/ com.mezimedia.mq.SmarterCDMTemp
4.gcc -I/usr/java/include -shared -o com/mezimedia/mq/libSmarterCDMTemp.so com/mezimedia/mq/SmarterCDMTemp.c
5.java com/mezimedia/mq/CalculatePriceRangeTest执行到第5步报出异常如下:
1
Exception in thread "main" java.lang.UnsatisfiedLinkError: calculatePriceRange
at com.mezimedia.mq.SmarterCDMTemp.calculatePriceRange(Native Method)
at com.mezimedia.mq.SmarterCDMTemp.calculatePriceRange(SmarterCDMTemp.java:187)
at com.mezimedia.mq.SmarterCDMTemp.calculatePriceRange(SmarterCDMTemp.java:146)
at com.mezimedia.mq.SmarterCDMTemp.calculatePriceRange(SmarterCDMTemp.java:111)
at com.mezimedia.mq.CalculatePriceRangeTest.main(CalculatePriceRangeTest.java:13)
其中第一行的1是我在程序中输出的,为了知道程序执行到哪一步了。因为我真实CalculatePriceRangeTest程序中重载了calculatePriceRange方法,有3个calculatePriceRange方法,一层一层调用下来,所以报的异常会有几个calculatePriceRange的情况。
1.CalculatePriceRangeTest.java(当作运行启动类用的)
package com.mezimedia.mq;
public class CalculatePriceRangeTest
{
public static void main(String[] args)
{
SmarterCDMTemp smCDM = new SmarterCDMTemp();
smCDM.calculatePriceRange(1);
}
}2.SmarterCDMTemp.java(native方法在此类声明)
package com.mezimedia.mq;
public class SmarterCDMTemp
{
static
{
System.load("/home/datateam/SmarterMQFE1/src/com/mezimedia/mq/libSmarterCDMTemp.so");
}
public void calculatePriceRange(int ChannelID)
{
System.out.println( "1" ); calculatePriceRange(""+ChannelID); System.out.println( "2" ); System.exit(0);
} public native static void calculatePriceRange(String ChannelID);
}3.com_mezimedia_mq_SmarterCDMTemp.h(生成的.h文件)
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_mezimedia_mq_SmarterCDMTemp */#ifndef _Included_com_mezimedia_mq_SmarterCDMTemp
#define _Included_com_mezimedia_mq_SmarterCDMTemp
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_mezimedia_mq_SmarterCDMTemp
* Method: calculatePriceRange
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_mezimedia_mq_SmarterCDMTemp_calculatePriceRange
(JNIEnv *, jclass, jstring);#ifdef __cplusplus
}
#endif
#endif4.SmarterCDMTemp.c(.c程序)
#include <stdio.h>
#include "/usr/include/mysql/mysql.h"
#include "com_mezimedia_mq_SmarterCDMTemp.h"JNIEXPORT void JNICALL Java_com_mezimedia_mq_SmarterCDMTemp_calculatePriceRange(JNIEnv * env, jclass cls, jstring str)
{
printf("perfect\n");
}我的操作步骤如下:
1.javac -d /home/datateam/SmarterMQFE1/build/classes com/mezimedia/mq/SmarterCDMTemp.java
2.javac -d /home/datateam/SmarterMQFE1/build/classes com/mezimedia/mq/CalculatePriceRangeTest.java3.javah -jni -d com/mezimedia/mq/ com.mezimedia.mq.SmarterCDMTemp
4.gcc -I/usr/java/include -shared -o com/mezimedia/mq/libSmarterCDMTemp.so com/mezimedia/mq/SmarterCDMTemp.c
5.java com/mezimedia/mq/CalculatePriceRangeTest执行到第5步报出异常如下:
1
Exception in thread "main" java.lang.UnsatisfiedLinkError: calculatePriceRange
at com.mezimedia.mq.SmarterCDMTemp.calculatePriceRange(Native Method)
at com.mezimedia.mq.SmarterCDMTemp.calculatePriceRange(SmarterCDMTemp.java:187)
at com.mezimedia.mq.SmarterCDMTemp.calculatePriceRange(SmarterCDMTemp.java:146)
at com.mezimedia.mq.SmarterCDMTemp.calculatePriceRange(SmarterCDMTemp.java:111)
at com.mezimedia.mq.CalculatePriceRangeTest.main(CalculatePriceRangeTest.java:13)
其中第一行的1是我在程序中输出的,为了知道程序执行到哪一步了。因为我真实CalculatePriceRangeTest程序中重载了calculatePriceRange方法,有3个calculatePriceRange方法,一层一层调用下来,所以报的异常会有几个calculatePriceRange的情况。
解决方案 »
- 帮忙看看正则表达式哪错了
- java标签的键盘事件
- 如何实现两个窗口间传递数据并显示(jbuilder环境下)
- JNI高难问题,如何与c++实现异步通信
- 无参数构造函数和有参数构造函数的区别在哪里? 有参数构造函数和类默认的构造函数的优势体现在那里?望高手指点,小第初学JAVA
- 请问crystal report如何在b/s模式下实现动态报表?
- jsdkee1.2.1中启动deploytool时发生异常java.lang.NullPointException该怎么办?急
- 有关网络编程
- 菜鸟请教:急!急!我需要做个商品价格走势图,不知用applet该怎么实现(我用的是JBuider),能否给个大概做法或源程序?
- c=c+a 与 c+=a 的区别
- ProgressMonitorInputStream不显示的问题????????????????
- IT新手,请各位代码狂人帮助。
改变dll存放位置
有的东西需要试
好久没装那个了
好像不需要.so
而且最好用相对路径