java代码:
public class Hello {
private native void nativeDifArgsMethod();
private void changeAryData(int[] buf, int index, int data)
{
System.out.println("In java");
System.out.println("index = " + index + " data = " + data); buf[index] = data;
System.out.println("In java end");
}

static{
System.loadLibrary("JavaTet");
}

public static void main(String[] args){
//System.out.print("succee");
Hello hl = new Hello();
hl.nativeDifArgsMethod();


}
}c语言代码:
JNIEXPORT void JNICALL Java_test_Hello_nativeDifArgsMethod(JNIEnv *env, jobject obj)
{
        int test[] = {4, 5, 6}; 
//jintArray arg;
jclass cls = (*env)->GetObjectClass(env, obj);
jmethodID mid = (*env)->GetMethodID(env, cls, "changeAryData", "([III)V");
//arg = (*env)->NewIntArray(env, 3);
//(*env)->SetIntArrayRegion(env, arg, 0, 3, test);
printf("In C\n");
printf("a[0] = %d, a[1] = %d, a[2] = %d\n", a[0], a[1], a[2]);
(*env)->CallVoidMethod(env, obj, mid, test, 1, 100);
printf("a[0] = %d, a[1] = %d, a[2] = %d\n", ary[0], ary[1], ary[2]);
}当(*env)->CallVoidMethod(env, obj, mid, test, 1, 100);
调用java方法时,会在buf[index] = data;这句代码上出错,错误信息Exception in thread "main" java.lang.NullPointerException。这个函数的功能是想改变数组某个下标的值,怎样才能达到这个功能?jni

解决方案 »

  1.   

    把int test[]改为jint 试试。
      

  2.   

    直接改变不就行了,jni函数里面有没有输出参数,也没有返回值,而且你的是C代码,直接改变不就行了,但是感觉干变了也没有,因为没返回值,或者说没返回参数。
      

  3.   

    我就是想研究它的参数传递机制啊,我以为传一个数值地址过去,jni可以将她转化成java的地址引用,结果不是的。
      

  4.   

    jni层的参数调用,用到了c和java的东西。
    如果你要用c中类似的引用,也就是参数返回的方式返回数据,那么你首先要知道他是地址返回,那么对应java中的就是类型,比如c中的函数void fun(int& i),用i来返回,那么在jni中的你的接口就要变成void fun(Integer i);因为java中的类可以表示c中的引用,那么你在使用jni.h中的头文件进行转换,把你需要的值放到i中。
    给你个jni中的函数例子,你可以参考:
    static jboolean readMcuRegister(JNIEnv* env, jobject thiz, int nDriverID, char cAddr[], jobject nValue)
    {
    jclass cls = env->GetObjectClass(nValue);
    jfieldID id;
    if( NULL == cls )
    {
    LOGD("get Integer class error!");
    return false;
    }
    id = env->GetFieldID(cls, "value", "I"); if( NULL == id )
    {
    LOGD("get class field id error!");
    return false;
    } int v = 15;
    env->SetIntField(nValue, id, v);
    //jmethodID mgetZoom = env->GetMethodID(cls,"valueOf","(I)Z"); return true;
    }
    求给分