NDK开发之Java-C互相传值

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中具体功能的实现方法

NDK开发之Java-C互相传值_第1张图片
Java中调用so库实现类

2.看我们C/C++中具体实现

NDK开发之Java-C互相传值_第2张图片
C中实现修改Java字符串的代码

首先拿到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中修改字符串,修改完成后返回。其中核心思想就相当于我们平时用到的反编译。

NDK开发之Java-C互相传值_第3张图片
Java属性与方法签名列表

3.编译生成so库,然后在Activity中调用该方法,会发现我们的字符串String已发生变化

NDK开发之Java-C互相传值_第4张图片
调用so库效果图

我们在类中定义字符串key="voyageSun",然后在C中进行修改,添加前缀super,这样就实现了在C中修改Java代码得效果。


二.C/C++中修改Java中的静态成员变量

套路还是一样的,在Java中声明静态成员变量public static int count=1;,在C中修改其值,具体实现方法直接贴出来了

NDK开发之Java-C互相传值_第5张图片
C中修改Java中的静态成员变量方法

三.C/C++中修改Java中的方法,既然可以修改Java中的变量,那么可以修改Java方法吗?肯定可以,我们在Java中定义一个方法public int getTestInt(int max){return max;},C中对其进行修改

NDK开发之Java-C互相传值_第6张图片
c中修改java方法示例

通过上面的示例,我们发现可以调用C来实现修改Java代码的目的,这样Java调用C实现功能,C修改Java中代码功能都可以实现了。

你可能感兴趣的:(NDK开发之Java-C互相传值)