C语言调用java类方法中参数传递关于数组参数的问题?

时间:2022-08-29 20:09:55
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。

这个函数的功能是想改变数组某个下标的值,怎样才能达到这个功能?

7 个解决方案

#1


C语言调用java类方法中参数传递关于数组参数的问题?

#2


不懂C,帮顶下

#3


把int test[]改为jint 试试。

#4


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

#5


引用 4 楼 hzlgonvstp 的回复:
直接改变不就行了,jni函数里面有没有输出参数,也没有返回值,而且你的是C代码,直接改变不就行了,但是感觉干变了也没有,因为没返回值,或者说没返回参数。
我就是想研究它的参数传递机制啊,我以为传一个数值地址过去,jni可以将她转化成java的地址引用,结果不是的。

#6


引用 3 楼 shandongmaxiao 的回复:
把int test[]改为jint 试试。
我试试

#7


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;
}
求给分。。。 C语言调用java类方法中参数传递关于数组参数的问题?

#1


C语言调用java类方法中参数传递关于数组参数的问题?

#2


不懂C,帮顶下

#3


把int test[]改为jint 试试。

#4


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

#5


引用 4 楼 hzlgonvstp 的回复:
直接改变不就行了,jni函数里面有没有输出参数,也没有返回值,而且你的是C代码,直接改变不就行了,但是感觉干变了也没有,因为没返回值,或者说没返回参数。
我就是想研究它的参数传递机制啊,我以为传一个数值地址过去,jni可以将她转化成java的地址引用,结果不是的。

#6


引用 3 楼 shandongmaxiao 的回复:
把int test[]改为jint 试试。
我试试

#7


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;
}
求给分。。。 C语言调用java类方法中参数传递关于数组参数的问题?