Liferay Portal的Action中应用JNI

来源:互联网 发布:成品油批发价年度数据 编辑:程序博客网 时间:2024/05/27 09:44

因为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文件放到别的地方都不行。

原创粉丝点击