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
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
如果你要用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;
}
求给分