java代码中调用c写的本地方法,在HelloWorld.java中声明为:
private static native byte[][] displayHelloWorld(String name) throws UnknownHostException;现在我有两个问题:
1、对应的c的函数是怎么写的?我在HelloWorld.c中写了
JNIEXPORT jbyte[][] JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env,jobject obj,jstring name)
可是编译c文件的时候报错:HelloWorld.c:5: error: expected identifier or ‘(’ before ‘[’ token
请问这是怎么回事?2、java中的UnknownHostException在c中是怎么实现的?需要在c中实现吗?完整代码见下面:
HelloWorld.javaimport java.net.UnknownHostException;class HelloWorld {
private static native byte[][] displayHelloWorld(String name) throws UnknownHostException;
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorld();
try{
helloWorld.displayHelloWorld("www.baidu.com");
} catch (UnknownHostException e) {}
}
}
HelloWorld.c#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h" JNIEXPORT jbyte[][] JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env,jobject obj,jstring name) {
printf("Hello World!\n");
printf("%s",name);
jbyte[][] a = {{(jbyte)119,(jbyte)75,(jbyte)217,(jbyte)109}};
return a;
}
private static native byte[][] displayHelloWorld(String name) throws UnknownHostException;现在我有两个问题:
1、对应的c的函数是怎么写的?我在HelloWorld.c中写了
JNIEXPORT jbyte[][] JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env,jobject obj,jstring name)
可是编译c文件的时候报错:HelloWorld.c:5: error: expected identifier or ‘(’ before ‘[’ token
请问这是怎么回事?2、java中的UnknownHostException在c中是怎么实现的?需要在c中实现吗?完整代码见下面:
HelloWorld.javaimport java.net.UnknownHostException;class HelloWorld {
private static native byte[][] displayHelloWorld(String name) throws UnknownHostException;
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
HelloWorld helloWorld = new HelloWorld();
try{
helloWorld.displayHelloWorld("www.baidu.com");
} catch (UnknownHostException e) {}
}
}
HelloWorld.c#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h" JNIEXPORT jbyte[][] JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env,jobject obj,jstring name) {
printf("Hello World!\n");
printf("%s",name);
jbyte[][] a = {{(jbyte)119,(jbyte)75,(jbyte)217,(jbyte)109}};
return a;
}
你可以看HelloWorld.h中,应该是jbyteArray,而不是jbyte[][]
(JNIEnv *env, jclass class, jstring name)
{
JNIEnv _env = *env;
if (NULL == name)
{
jclass exC = _env->FindClass(env, "java/net/UnknownHostException");
check(exC);
_env->ThrowNew(env, exC, "test");
return NULL;
}
jbyteArray arr = _env->NewByteArray(env, 3);
check(arr);
jbyte arrV[] = {23, -9, 89};
_env->ReleaseByteArrayElements(env, arr, arrV, 0);
jclass c1 = _env->GetObjectClass(env, arr);
check(c1);
jobjectArray r = _env->NewObjectArray(env, 1, c1, arr);
return r;
}
private static native byte[][] displayHelloWorld(String name) throws UnknownHostException; public static void main(String[] args) throws UnknownHostException {
byte[][] r = displayHelloWorld("ll");
System.out.println(r.length);
System.out.println(Arrays.toString(r[0]));
displayHelloWorld(null);
}
GetArray.javaclass GetArray {
private native static int[][] getIntArray();
static {
System.loadLibrary("SendInt");
}
public static void main(String[] args) {
int d[][]=getIntArray();
for(int i=0;i<d.length;i++){
for(int j=0;j<d[i].length;j++){
System.out.print(d[i][j]+" ");
}
System.out.println();
}
}
} SendInt.c#include "jni.h"
#include <stdio.h>
#include "GetArray.h"
JNIEXPORT jobjectArray JNICALL Java_GetArray_getIntArray(JNIEnv *env, jclass obj){
jobjectArray array;
int c[3][5]={ {1,2,3,4,5},
{6,7,8,9,10},
{11,12,13,14,15} };
int i,j;
jint* pi;
jintArray jia;
array=(*env)->NewObjectArray(env,3,(*env)->FindClass(env,"java/lang/Object"),0);
for(i=0;i<3;i++){
jia=(*env)->NewIntArray(env,5);
(*env)->SetIntArrayRegion(env,jia,0,5,c[i]);
(*env)->SetObjectArrayElement(env,array,i,jia);
}
return array;
}