方法一 使用JNI方式调用DLL,这种方式有个明显的缺点,就是必须先写好JAVA类,再通过JAVA类去创建DLL,这种方式在调用第三方类库时显然不可行。好处是JAVA类调用比较简单,已经明确知道DLL接口。

流程如下:

1 编写TestPmCtrl.java
2 Java TestPmCtrl  产生TestPmCtrl.class
3 Javah TestPmCtrl 产生TestPmCtrl.h
4 把TestPmCtrl.h中的<jni.h>修改为"jni.h"
5 在PmCtrlDll工程中PmCtrlDll动态库创建工程中添加java调用函数,这里添加了以下4个函数

//输出电压电流
 JNIEXPORT jlong JNICALL Java_TestPmCtrl_OutPutValue
 (JNIEnv *env, jobject obj, jstring jMode, jstring jPara)
 {
const char *strMode = env->GetStringUTFChars( jMode , 0);  
const char *strPara = env->GetStringUTFChars( jPara , 0);
//执行代码
 }


 //停止输出
 JNIEXPORT void JNICALL Java_TestPmCtrl_Stop
 (JNIEnv *, jclass)
 {
//执行代码
 }

 JNIEXPORT void JNICALL Java_TestPmCtrl_OutPutState
   (JNIEnv *env, jobject obj, jbooleanArray jArray)
 {
env->GetArrayLength(jArray);
BYTE bState[4] = {0};
unsigned char* psta = (unsigned char*)env->GetBooleanArrayElements(jArray,0);
bState[0] = (unsigned char)psta[0];
bState[1] = (unsigned char)psta[1];
bState[2] = (unsigned char)psta[2];
bState[3] = (unsigned char)psta[3];
//执行代码SetOutStatus(bState);
 }

 //读入开关状态
 JNIEXPORT jcharArray JNICALL Java_TestPmCtrl_ReadInputState
 (JNIEnv *env, jobject obj)
 {
//实现返回状态结果处理
jcharArray ar = env->NewCharArray(nCount);
for (int i=0;i<nCount;i++)
{
//执行代码
}

return ar;
 }