HelloWorld 善战者,求之于势,不责于人;故能择人而任势。

知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得。物有本末,事有终始。知所先后,则近道矣。

  BlogJava :: 首页 ::  :: 联系 ::  :: 管理 ::
  167 随笔 :: 1 文章 :: 40 评论 :: 0 Trackbacks
新建立ArrayHandler.java
package com.user;
public class ArrayHandler {
     private String arrayResults[];
     int arraySize = -1;
     public native void returnArray();
     static {
         System.loadLibrary("nativelib");
     }
     public void sendArrayResults(String results[]) {
         arraySize = results.length;
         arrayResults = new String[arraySize];
         System.arraycopy(results, 0, arrayResults, 0, arraySize);
     }
     public void displayArray() {
         for (int i = 0; i < arraySize; i++) {
             System.out.println("array element " + i + "= " + arrayResults
);
         }
     }
     public static void main(String args[]) {
         String ar[];
         ArrayHandler ah = new ArrayHandler();
         ah.returnArray();
         ah.displayArray();
     }
}
   
Windows
( 1 ).Javc ArarayHandler.java
在当前目录下建立com目录,在com中建立user目录,把ArrayHandler.class拷贝到user目录下
( 2 )javah –jni com.user.ArrayHandler
产生com_user_ArrayHander.h文件
( 3 )建立一个dll项目 nativelib
新建一个com_user_ArrayHandler.cpp
#include <jni.h>
#include <iostream.h>
#include "com_user_ArrayHandler.h"
JNIEXPORT void JNICALL Java_com_user_ArrayHandler_returnArray
(JNIEnv *env, jobject jobj){
jobjectArray ret;      //定义一个数组类型的对象
int i;
jclass cls;
jmethodID mid;
char *message[5]= {"first", "second", "third",      "fourth", "fifth"};
ret=(jobjectArray)env->NewObjectArray(5,
      env->FindClass("java/lang/String"),
      env->NewStringUTF(""));
for(i=0;i<5;i++) {
    env->SetObjectArrayElement(ret,i,env->NewStringUTF(message
));
}
cls=env->GetObjectClass(jobj);//得到jobj类的对象
//mid为ArrayHandler中的sendArrayResluts()方法
mid=env->GetMethodID(cls, "sendArrayResults",      "([Ljava/lang/String;)V");
if (mid == 0) {
    cout <<"Can't find method sendArrayResults";
    return;
}    
env->ExceptionClear();//清空异常信息
env->CallVoidMethod(jobj, mid, ret);//调用方法sendArrayResluts()
if(env->ExceptionOccurred()) {
    cout << "error occured copying array back" <<endl;
    env->ExceptionDescribe();
    env->ExceptionClear();
}
return;
}
我用的是Dev-c++
建立一个dll项目,产生2个文件保存就可以了
把项目的include路径 增加 本地jdk的include 目录和 include/win32路径
builder All
产生nativelib.dll文件
java com.user.ArrayHandler
结果:
array element 0= first
array element 1= second
array element 2= third
array element 3= fourth
array element 4= fifth
Linux
拷贝ArrayHandler.java; com_user_ArrayHandler.cpp到某个目录下
(1)      javac ArrayHandler.java
(2)      mkdir com
(3)      cd com
(4)      mkdir user
(5)      cd ..
(6)      cd ..
(7)      回到 ArrayHandler.java目录
(8)      cp ArrayHandler.class com/user/
(9)      javah -classpath=. -jni com/user/ArrayHandler
(10)      g++ -o libnativelib.so -shared -I$JAVAHOME/include -I$JAVAHOME/include/linux com_user_ArrayHandler.cpp
(11)      java -Djava.library.path=. com/user/ArrayHandler
(12)      结果同Windows


</script>

posted on 2007-08-13 18:50 helloworld2008 阅读(311) 评论(0)  编辑  收藏 所属分类: java

只有注册用户登录后才能发表评论。


网站导航: