前言
某坑公司的面试题如下
我认真了想想,这无非就是Java 的值传递和引用传递,利用反射是可以做到的
反射
public static void doSomethingReflect(Integer a, Integer b) throws Exception {
Field field = a.getClass().getDeclaredField("value");
field.setAccessible(true);
field.set(a, 400);
Field fieldb = b.getClass().getDeclaredField("value");
fieldb.setAccessible(true);
fieldb.set(b, 500);
}
jni
public class JniMain {
public static void main(String[] args) {
int a, b;
a = 4;
b = 5;
doSomething(a, b);
System.out.println(String.format("a = %s ; b= %s ", a, b));
}
private static void doSomething(int a, int b) {
System.load(JniMain.class.getResource("JniMain.jnilib").getPath());
doSomethingInC(a, b);
}
static native int doSomethingInC(Integer a, Integer b);
}
#include <jni.h>
#include "jni_JniMain.h"
JNIEXPORT jint JNICALL Java_jni_JniMain_doSomethingInC
(JNIEnv *env, jobject thiz, jobject p1, jobject p2){
jclass c;
jfieldID id;
c = (*env)->FindClass(env,"java/lang/Integer");
if (c==NULL)
{
return -1;
}
id = (*env)->GetFieldID(env,c, "value", "I");
if (id==NULL)
{
return -1;
}
(*env)->SetIntField(env,p1, id, 400);
(*env)->SetIntField(env,p2, id, 500);
}
Done