详解jni中的java接口的使用

  介绍

这篇文章运用简单易懂的例子给大家介绍详解jni中的java接口的使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

项目需求,需要在c++函数中监听相应的状态,并在java端进行一些列的处理。

这个需要在jni中写一个订户,注册后在需要的地方进行引入使用。

初始化是当上的c++工程文件,这边先暂时实现简单的演示,CdemoActivity是NativeActivity的实现,我们暂时别管,因为实现是c++层控制的,有兴趣可以去百度下

详解jni中的java接口的使用“> </p> <p>主要涉及jnicallback等c文件和JNIUtil这java文件</p> <p> JNIUtil </p> <pre class=公共类JNIUtil {      静态{      System.loadLibrary (“native-event");   }//注册函数   公共静态原生空隙setJniCallBack (JniCallBack回调);//解注册函数   公共静态原生空隙unJniCallBack ();      公共接口JniCallBack {      空白>////创建86130年> # include & lt; jni.h>   # include & lt; malloc.h>   # include & lt; cstring>      # include“jnicallback.h"      # ifdef __cplusplus   外来的“C" {   # endif      JavaVM * g_VM;   jobject用户;      外来的“C"   JNIEXPORT空白JNICALL Java_com_demo_cdemo_JNIUtil_setJniCallBack (JNIEnv * env, jclass clazz, jobject call_back) {      env→GetJavaVM(及g_VM);   用户=env→NewGlobalRef (call_back);      }      外来的“C"   JNIEXPORT空白JNICALL Java_com_demo_cdemo_JNIUtil_unJniCallBack (JNIEnv * env, jclass clazz) {      如果(订户!=NULL)   {   env→DeleteGlobalRef(订户);   }   }      JNIEnv * getEnv ()   {   JNIEnv * env;   如果(g_VM==NULL)   {   返回NULL;   }   int envStat=g_VM→GetEnv (void * *), env, JNI_VERSION_1_6);   如果(envStat==JNI_EDETACHED)   {   如果(g_VM→AttachCurrentThread(及env, NULL) !=0)   {   返回NULL;   }   }   返回env;   }      jmethodID getMethodIdByNameAndSig (JNIEnv * env, const char *名字,const char *团体)   {   如果(env==NULL | |用户==NULL)   {   返回NULL;   }   jclass subscriberClass=env→GetObjectClass(订户);   如果(用户==0)   {   返回NULL;   }   jmethodID methodId=env→GetMethodID (subscriberClass、名称、团体);   如果(methodId==0)   {   返回NULL;   }   返回methodId;   }//头文件方法实现   空白>项目(Native-Activity)      cmake_minimum_required(3.4.1版)      #引入native_app_glue头文件   include_directories (F:/AndroidSdk/Sdk/ndk-bundle/资源/android/native_app_glue)      add_library (native-activity共享   main.cpp   jnicallback.cpp)      add_library (native-event共享jnicallback.cpp)      find_library (log-lib日志)   find_library (OPENGLES3_LIBRARY GLESv3“OpenGL ES v3.0 library")   find_library (EGL_LIBRARY EGL“EGL 1.4 library")   find_library (android-lib android)      #编译为静态库   add_library (app_glue静态   android_native_app_glue.c)      target_link_libraries (native-event   $ {log-lib} #链接日志库   $ {android-lib} #链接android库   )      target_link_libraries (native-activity   app_glue #链接静态库native_app_glue   $ {log-lib} #链接日志库   $ {android-lib} #链接android库   $ {OPENGLES3_LIBRARY} #链接opengl库   $ {EGL_LIBRARY} #链接EGL库   )

JNIUtil的使用

包com.demo.cdemo;
  
  进口android.app.NativeActivity;
  进口android.content.Intent;
  进口android.os.Bundle;
  进口android.os.Looper;
  进口android.util.Log;
  公开课CdemoActivity延伸NativeActivity {
  
  静态{
  System.loadLibrary (“native-activity");
  }
  
  布尔isFirst=false;
  
  @Override
  保护空白>关于详解jni中的java接口的使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看的到。

详解jni中的java接口的使用