zoukankan      html  css  js  c++  java
  • 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());
    }

    运行效果:

      

  • 相关阅读:
    struts2 标签给iterator添加自然序号
    theirtts2
    zhihutheirTTS1
    theirs《A 2019 Guide to Speech Synthesis with Deep Learning》
    theirmvsnetv00000
    theirmvsnetv2
    theirMeshCNN/
    their MVF-Net: Multi-View 3D Face Morphable Model Regression(2019 CVPR)
    their DenseFusion6dof
    C++35
  • 原文地址:https://www.cnblogs.com/renhui/p/10495146.html
Copyright © 2011-2022 走看看