新建立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
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>