CSDN链接 在平时的NDK开发中,我们通常使用C/C++封装好so库,然后客户端调用so库以完成我们的需求,在上一遍入门中(NDK开发之初入门-Hello Word)我们在So库方法中实现返回字符串Hello Word,然后在Java中进行调用so库中实现好的方法,以达到我们的需求,那么如果我们需要在C/C++中调用Java中的方法时,该如何实现呢?或者在C/C++中修改Java中的数值,该如何实现呢?
一.C/C++中修改Java中的成员变量
1.首先我们在Java中定义一个成员变量key,public String key="voyageSun";我们的目的是修改当前key的值,不过是使用C/C++进行修改。下图中我们定义了一个字符串key,加载了一个so库,accessField是C中具体功能的实现方法
2.看我们C/C++中具体实现
首先拿到jclass,就是我们java中实现类的class文件,然后拿到属性id,我们将根据这个属性拿到需要修改的字符串量,GetFieldID有四个参数,前两个不需要解释,分别传入JNIEnv和jclass,第三个参数是我们获取Java中字符串的key值,我们定义的字符串为public String key,在传入key,若我们定义的字符串为public String TestString,那么传入的就是TestString,此处传入的就是变量名称,第四个参数传入的变量签名,具体参照下图Java属性与方法签名列表,若我们需要获取的数据类型是int,那么该处需要传入的参数为"I",现在我们获取的是String类型的变量,那么需要传入的就是Ljava/lang/String;(注:后面必须添加;)。获取到该id后,然后根据id拿到Java中对应的字符串,在C中修改字符串,修改完成后返回。其中核心思想就相当于我们平时用到的反编译。
3.编译生成so库,然后在Activity中调用该方法,会发现我们的字符串String已发生变化
我们在类中定义字符串key="voyageSun",然后在C中进行修改,添加前缀super,这样就实现了在C中修改Java代码得效果。
二.C/C++中修改Java中的静态成员变量
套路还是一样的,在Java中声明静态成员变量public static int count=1;,在C中修改其值,具体实现方法直接贴出来了
三.C/C++中修改Java中的方法,既然可以修改Java中的变量,那么可以修改Java方法吗?肯定可以,我们在Java中定义一个方法public int getTestInt(int max){return max;},C中对其进行修改
通过上面的示例,我们发现可以调用C来实现修改Java代码的目的,这样Java调用C实现功能,C修改Java中代码功能都可以实现了。