因为Liferay Portal需要和别的基于C++的系统集成起来,所以开始琢磨着怎么在自己写的Action中加入Java Native Interface (JNI)。
1. 创建AjaxPollingAction.java。 关于如何在Liferay系统的ext环境下增加自己定制的Action可参考前面的文章。
在这个action中需要读取来自于C++系统的数据,定义了一个native的readData。再载入库AjaxPollingDll。
package com.ext.portal.action;
public class AjaxPollingAction extends Action
{
private native double[] readData(String Name1, String Name2);
static {
System.loadLibrary("AjaxPollingDll");
}
......
}
2. 编译AjaxPollingAction.java并生成所需要的.h文件 :com_ext_portal_action_AjaxPollingAction.h。
com_ext_portal_action_AjaxPollingAction.h
---------------------------------------------------------------
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ext_portal_action_AjaxPolling */
#ifndef _Included_com_ext_portal_action_AjaxPolling
#define _Included_com_ext_portal_action_AjaxPolling
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ext_portal_action_AjaxPolling
* Method: readLocationData
* Signature: (Ljava/lang/String;)[D
*/
JNIEXPORT jdoubleArray JNICALL Java_com_ext_portal_action_AjaxPollingAction_readData
(JNIEnv *, jobject, jstring, jstring);
#ifdef __cplusplus
}
#endif
#endif
javac -d d:/ AjaxPollingAction.java
javah -jni com.ext.portal.action.AjaxPollingAction
3. 在VC++中创建一个dll项目 :AjaxPollingDll,将上面生成的.h文件加入。具体过程可参见前面有一篇关于JNI的文章。这里我选用的是release模式,听说是必须的,由于时间关系没有去尝试debug模式是否也可行。这里需要把java jdk的include目录和下面的win32目录包含进项目。
AjaxPollingAction.cpp
--------------------------------
#include "com_ext_portal_action_AjaxPollingAction.h"
JNIEXPORT jdoubleArray JNICALL Java_com_ext_portal_action_AjaxPollingAction_readData
(JNIEnv * env, jobject obj, jstring Name1, jstring Name2)
{
......
}
4. 将上面编译生成的dll文件(以及如果有引用到的其他dll文件)拷贝如windows/system32目录。 这个地方有些迷惑,好像把dll文件放到别的地方都不行。