当.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的情况。