• JNI实战(四):C 调用 Java


    在前面我们讲了一下如何使用Java调用C,本文我们讲一下如何使用JNI提供的接口来反射得到Java方法进行调用。

    主要步骤如下:

    1. FindClass (找到Java层的类)
    2.  GetMethodID /  GetFieldID (获取Java类中的方法 / Java类中的属性)
    3.  NewObject (创建Java对象)
    4.  Call<TYPE> Method / [G/S]et<Type> Field (调用方法 / 设置属性)

    实战

    Java层:

    package com.renhui.jnihelloworld;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // Example of a call to a native method
            TextView tv = findViewById(R.id.sample_text);
            tv.setText(stringFromJNI());
        }
    
        /**
         * A native method that is implemented by the 'native-lib' native library,
         * which is packaged with this application.
         */
        public native String stringFromJNI();
    
        // Used to load the 'native-lib' library on application startup.
        static {
            System.loadLibrary("native-lib");
        }
    }

    C++层:

    #include <jni.h>
    #include <string>
    #include <iostream>
    
    //FindClass (找到Java层的类)
    //
    //GetMethodID /  GetFieldID (获取Java类中的方法 / Java类中的属性)
    //
    //NewObject (创建Java对象)
    //
    //Call<TYPE> Method / [G/S]et<Type> Field (调用方法 / 设置属性)
    
    #define JNI_CLASS_PATH "com/renhui/jnihelloworld/Student"
    
    extern "C" JNIEXPORT jstring JNICALL
    Java_com_renhui_jnihelloworld_MainActivity_stringFromJNI(JNIEnv *env, jobject /* this */) {
    
        // 找到Java层的类
        jclass clazz = env->FindClass(JNI_CLASS_PATH);
    
        jmethodID jmethod_init_id = env->GetMethodID(clazz, "<init>", "()V");
        jmethodID jmethod_set_id = env->GetMethodID(clazz, "setYear", "(I)V");
        jmethodID jmethod_get_id = env->GetMethodID(clazz, "getYear", "()I");
    
        jobject obj = env->NewObject(clazz, jmethod_init_id);
    
        env->CallVoidMethod(obj, jmethod_set_id, 28);
    
        int year = env->CallIntMethod(obj, jmethod_get_id);
    
        char tmp[] = {0, };
    
        std::string hello = "Hello World, year = ";
    
        sprintf(tmp, "%d", year);
    
        hello.append(tmp);
    
        return env->NewStringUTF(hello.c_str());
    }

    运行效果:

      

  • 相关阅读:
    一次优化web项目的经历记录(一)
    自己做的萌萌哒的js宠物挂件~
    最近的两个小项目,2:Python webapp的docker镜像
    最近的两个小项目,1:在Vscode里写C/C++
    Markdown写接口文档,自动添加TOC
    使用SqlAlchemy时如何方便的取得dict数据、dumps成Json
    【漏洞预警】SaltStack远程命令执行(CVE-2020-11651、CVE-2020-11652) 植入挖矿木马的应急响应 salt-minions salt-store挖矿程序跑满cpu
    pycharm 常用配置
    gitlab + jenkins + docker + k8s
    Microservice 概念
  • 原文地址:https://www.cnblogs.com/renhui/p/10495146.html
Copyright © 2020-2023  润新知