常量指针和指针常量
void main(){
//常量变量:被常量修饰的变量,不能再次被赋值(Java)
//常量指针:const在*之前,指针的地址是可以被再次赋值的(可以修改的),指针地址上面的值(变量)是不能被修改的,常量指针的常量是不能被修改的
//指针常量:const在*之后,指针的地址是不可以被再次赋值的,指针地址上面的值是可以被修改的,指针常量的指针地址是不能被修改的
//常量 不可被修改
const int number = 100;
int number1 = 100;
int number2 = 200;
//常量指针
const int *n_p = &number2;
//赋值
n_p = &number1;
printf("n_p=%p", n_p);
//*n_p = 300;值是不可修改的 ,但是地址是可以修改的
int *const n_p1 = &number2;
//n_p1 = &number1;地址是不能被重新赋值的
*n_p1 = 300;
getchar();
}
Native 层构建 Java 对象
怎么在c层构建java对象,并返回对象给java?
java层代码,新建point类
public class Point {
private int x;
private int y;
public int getX() {
return x;
}
public int getY() {
return y;
}
public Point(int x, int y) {
this.x = x;
this.y = y;
}
}
新建NdkSimple1类
static {
//引入加载我们的动态库
//System.loadLibrary():android中加载apk中的.so库
//System.load()加载一个具体路径上的so库,去服务器下载再进行加载
System.load("D:/visual studio 2013/Projects/jni/x64/Debug/jni.dll");
}
public static void main(String[] args) {
// NdkSimple1 ndkSimple1 = new NdkSimple1();
Point point=createPoint();
System.out.println("point:x ="+point.getX()+",y="+point.getY());
}
private static native Point createPoint();
c代码实现
JNIEXPORT jobject JNICALL Java_com_example_demo_NdkSimple1_createPoint
(JNIEnv *env, jclass jclz){
//jclz代表的是NdkSimple1,项目的类`
//全类名 .换成/
jclass point_clz = (*env)->FindClass(env, "com/example/demo/Point");
//构建java层point的对象 构造函数的id,构造方法<init>
jmethodID j_mid = (*env)->GetMethodID(env, point_clz, "<init>", "(II)V");
jobject point=(*env)->NewObject(env, point_clz, j_mid,16,45);
return point;
}
做个测试,修改Y的值,只需要修改c的代码即可
- 通过set的方法修改y的值
JNIEXPORT jobject JNICALL Java_com_example_demo_NdkSimple1_createPoint
(JNIEnv *env, jclass jclz){
//jclz代表的是NdkSimple1,项目的类`
//全类名 .换成/
jclass point_clz = (*env)->FindClass(env, "com/example/demo/Point");
//构建java层point的对象 构造函数的id,构造方法<init>
jmethodID j_mid = (*env)->GetMethodID(env, point_clz, "<init>", "(II)V");
jobject point=(*env)->NewObject(env, point_clz, j_mid,16,45);
//给y重新赋值,调用set方法
j_mid = (*env)->GetMethodID(env, point_clz, "setY", "(I)V");
(*env)->CallVoidMethod(env, point, j_mid, 33);
return point;
}
- 直接通过属性赋值修改x的值
jfieldID j_fid = (*env)->GetFieldID(env, point_clz, "x", "I");
(*env)->SetIntField(env, point, j_fid, 55);
网友评论