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;  
}  

解决方案 »

  1.   

    JNIEXPORT jbyte[][] JNICALL ......这个错了
    你可以看HelloWorld.h中,应该是jbyteArray,而不是jbyte[][]
      

  2.   

    jbyteArray是对应jbyte[],而不是jbyte[][]吧?谁能给个在java中返回的参数是byte[][]的c的实现例子啊~
      

  3.   

    JDK 里面 javah.exe 可以生成头文件。#define check(var) if (NULL == var) return NULLJNIEXPORT jobjectArray JNICALL _Java_test_Main_displayHelloWorld
    (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);
        }
      

  4.   

    下面是返回二维数组的例子
    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;
    }