so层调用Java层无返回值普通方法和静态方法

一、编写java代码

  1.java代码定方法,一个静态一个非静态

public class MainActivity extends AppCompatActivity {

    private static Context context;

    //普通字段
    public String  testStr = "java普通字段";
    //静态字段
    public static String  staticTtestStr = "java静态字段";

    static{
        System.loadLibrary("testJni");
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = this.getApplicationContext(); //这里是重点,要确保context不为Null
        //调用下方的native函数
        soCallJavaFunction();
    }

    //定义两个普通的方法,第一个普通的方法
    public void _method(){
        Toast.makeText(this,"这是普通的方法~",Toast.LENGTH_LONG).show();
    }
    //定义静态方法
    public static void static_method(){
        Toast.makeText(context,"静态方法~",Toast.LENGTH_LONG).show();
    }

    /**
     * 调用so层,使用so层代码调用java层的函数方法
     */
    private native String soCallJavaFunction();
}

0.png


  2.生成头文件,重命名.h文件并移动到src同级的jni目录(我这里重命名testJni.h)并创建.c文件

1.png


  3.编写C代码
    //调用java层的方法
JNIEXPORT jstring JNICALL Java_com_example_mypc_myxphook_MainActivity_soCallJavaFunction
  (JNIEnv *env, jobject obj){
    //---------------------------------调用普通方法-------------------------------------------
    //查找Java的Class类返回一个jclass,env  第二个参数为类的路径
    //JNI原方法    jclass      (*FindClass)(JNIEnv*, const char*);
    jclass clazz = (*env)->FindClass(env,"com/example/mypc/myxphook/MainActivity");

    //获取普通方法ID env class java方法名 返回值类型 void为()V
    //JNI 原方法   jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
    jmethodID _jmethodID = (*env)->GetMethodID(env, clazz, "_method", "()V");

    //调用普通方法,env obj 方法id 返回值类型+签名
    //JNI 原方法   void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
    (*env)->CallVoidMethod(env,obj, _jmethodID);

    //---------------------------------调用静态方法-------------------------------------------

    //获取静态方法ID env,class,方法名,签名返回值
    //JNI 原方法       jmethodID   (*GetStaticMethodID)(JNIEnv*, jclass, const char*, const char*);
    jmethodID _jstaticmethodID = (*env)->GetStaticMethodID(env, clazz, "static_method", "()V");
    //调用java静态方法 env,class,方法ID
    //JNI原方法        void        (*CallStaticVoidMethod)(JNIEnv*, jclass, jmethodID, ...);
    (*env)->CallStaticVoidMethod(env, clazz, _jstaticmethodID);

    return (*env)->NewStringUTF(env,"1");
    //---------------------------------完  毕------------------------------------------------

}

2.png


  3.Java层调用native函数

4.png


友情提示:值得注意的是在Java层调用Toast.makeText如果是在静态方法内调用,第一参数Context需要在调用本方法之前传入一个静态的且初始化的context的对象

  3.运行结果如下:

5.png

6.png


在浏览的同时希望给予作者打赏,来支持作者的服务器维护费用.一分也是爱~