方法一 使用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;
}