美文网首页程序员
JNI开发:cpp与java通信

JNI开发:cpp与java通信

作者: 世外大帝 | 来源:发表于2020-07-01 16:43 被阅读0次

    java

    MainActivity.java

    package com.example.administrator.myapplication;
    
    import android.os.Bundle;
    import androidx.appcompat.app.AppCompatActivity;
    import android.util.Log;
    import android.view.Surface;
    import android.view.SurfaceView;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity
    {
    
        static
        {
            System.loadLibrary("demo");
        }
    
        private Button conn_and_start;
    
        // cpp方法
        private native int Start();
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
            initViewListener();
        }
    
        private void initViewListener()
        {
            // TODO Auto-generated method stub
            btn.setOnClickListener(new View.OnClickListener()
            {
    
                @Override
                public void onClick(View v)
                {
                    // TODO Auto-generated method stub
                    Start();
                }
            });
        }
    
        private void initView()
        {
            btn = (Button) findViewById(R.id.btn);
        }
    
        public void callBack(String p_result)
        {
            Log.e("callBack", "callBack: "+p_result);
        }
    }
    
    

    cpp

    demo.cpp

    #include"demo.h"
    #include"staticJNI.h"
    #include <jni.h>
    #include <android/log.h>
    
    #define  LOG_TAG    "GLRender"
    #define  LOGI(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
    #define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
    
    #ifdef __cplusplus
    extern "C" {
    #endif
        
    void detect_face_cb(char* p_result)
    {
        if (p_result != NULL)
        {
            char *picInfo = p_result;
    
            JNIEnv *env = NULL;
            JavaVM *javaVm = staticJNI::getJavaVM();
            if (javaVm == NULL)
                return;
            int nStatus = (javaVm)->GetEnv((void **) &env, JNI_VERSION_1_4);
            if (nStatus != JNI_OK)
            {
                nStatus = (javaVm)->AttachCurrentThread(&env, NULL);
            }
    
            if (nStatus != JNI_OK)
            {
                return;
            }
    
            jclass clazz = staticJNI::getMainActivity_cls();
    
            if (clazz != NULL)
            {
                jobject obj = env->AllocObject(clazz);
                jmethodID mid = env->GetMethodID(clazz, "callBack","(Ljava/lang/String;)V");
                if (picInfo != NULL)
                    env->CallVoidMethod(obj, mid,env->NewStringUTF(picInfo));
            }
    
        }
    }
    
    
    jint Java_com_example_administrator_myapplication_MainActivity_Start(JNIEnv *env, jobject obj)
    {
    
        char * c_result = "callBack";
        detect_face_cb(c_result);
    
        return 0;
    }
    
    
    #ifdef __cplusplus
    }
    #endif
    

    staticJNI.h

    #ifndef _STATICJNI_H_
    #define _STATICJNI_H_
    
    #include <jni.h>
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    static JavaVM *javaVm;
    static jclass main_cls;
    
    class staticJNI
    {
    public:
    
        static JavaVM* getJavaVM();
        static jclass getMainActivity_cls();
    };
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    
    

    staticJNI.cpp

    #ifdef ANDROID
    #include "staticJNI.h"
    #include <stdlib.h>
    #include <android/log.h>
    
    #define  LOG_TAG    "staticJNIJava"
    #define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
    #define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)
    #define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)
    
    JavaVM* staticJNI::getJavaVM()
    {
        return javaVm;
    }
    jclass staticJNI::getMainActivity_cls()
    {
        return main_cls;
    }
    jint  JNI_OnLoad(JavaVM* vm, void* reserved)
    {
        JNIEnv *env;
        javaVm = vm;
        int nRet = -1;
    
        if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) == JNI_OK)
        {
            if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) == JNI_OK)
            {
                jclass main_clazz = env->FindClass("com/example/administrator/myapplication/MainActivity");
    
                if(main_clazz != NULL)
                {
                    main_cls = (jclass)env->NewGlobalRef(main_clazz);
                    nRet = JNI_VERSION_1_4;
                }
    
            }
            nRet = JNI_VERSION_1_4;
        }
        return nRet;
    }
    
    void JNI_OnUnload(JavaVM* vm, void* reserved)
    {
        javaVm = NULL;
        int nRet = -1;
    }
    
    #endif
    
    
    

    相关文章

      网友评论

        本文标题:JNI开发:cpp与java通信

        本文链接:https://www.haomeiwen.com/subject/jllhqktx.html