`
anson_xu
  • 浏览: 509557 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

android中使用jni,ndk的C语言回调方法

阅读更多

android中使用jni,ndk的C语言回调方法

(2010-10-23 14:06:59)

    不说太罗嗦了,回调分为Java代码和C语言代码两部分,我举的例子简单而且是通过调试可以运行的.

    Java代码:

    //====================================================================
    package com.example.hellojni;

    import android.app.Activity;
    import android.util.Log;
    import android.widget.TextView;
    import android.os.Bundle;


    public class HelloJni extends Activity
    {
         public String mJniMsg;
 
         public HelloJni(){}
         @Override
        public void onCreate(Bundle savedInstanceState)
        {
             super.onCreate(savedInstanceState);

             //System.loadLibrary("hello-jni");
             TextView  tv = new TextView(this);
             tv.setText("Eagle,morning!");
             setContentView(tv);
             doCLanguageWork();
        }

        public void myCallbackFunc(String nMsg)
        {
             Log.v("EagleTag","back message:"+nMsg);
        }
        public native String doCLanguageWork();

        static

        {
            System.loadLibrary("hello-jni");
        }
    }

 

    C语言代码部分:

    //====================================================================
    #include <string.h>
    #include <jni.h>

    JNIEXPORT jstring JNICALL
    jobject  gJniObj;
    jclass  gJniClass;
    jmethodID gJinMethod;


    void  GetInstance(JNIEnv* env, jclass obj_class);
    void  DisplayCallBack(JNIEnv* env);

    JNIEXPORT jstring JNICALL
    Java_com_example_hellojni_HelloJni_doCLanguageWork(JNIEnv* env, jobject obj)
    {
         char  tChar[256];
         gJniClass=0;
         gJinMethod=0;
 
         gJniClass=(*env)->FindClass(env,"com/example/hellojni/HelloJni");
         if(gJniClass==0 || gJniClass==NULL)
              return (*env)->NewStringUTF(env, "-1");
  
         GetInstance(env,gJniClass);

         gJinMethod=(*env)->GetMethodID(env,gJniClass,"myCallbackFunc","(Ljava/lang/String;)V");
         if(gJinMethod==0 || gJinMethod==NULL)
             return (*env)->NewStringUTF(env, "-2");
 
         strcpy(tChar,"PROG:10");
         (*env)->CallVoidMethod(env,gJniObj,gJinMethod,(*env)->NewStringUTF(env, tChar));
         DisplayCallBack(env);
 
         return (*env)->NewStringUTF(env, "Eagle is really great!......");
    }

    void GetInstance(JNIEnv* env, jclass obj_class) 
    {  
         jmethodID construction_id = (*env)->GetMethodID(env,obj_class, "<init>", "()V"); 
         gJniObj = (*env)->NewObject(env,obj_class, construction_id); 
    } 

    void DisplayCallBack(JNIEnv* env)
    {
         char tChars[256];
 
         strcpy(tChars,"DEBUG:Hello,Eagle");
         (*env)->CallVoidMethod(env,gJniObj,gJinMethod,(*env)->NewStringUTF(env, tChars)); 
    }
    怎么样?不是很难吧?具体能不能理解,就看大家的编程经验怎么样了?

分享到:
评论

相关推荐

    jni编程c回调java的方法

    JNI编程中实现C回调Java的方法,主要涉及以下几个步骤:声明`native`方法、生成JNI头文件、编写C/C++代码、实现回调逻辑、编译本地库以及在Java代码中调用。理解和熟练掌握这些步骤,能够帮助开发者充分利用C/C++的...

    android jni c回调java

    本教程将详细介绍如何在Android中使用JNI实现C语言回调Java的方法,包括有参无参、有无返回值以及静态非静态函数的不同情况。 1. **JNI基础概念** JNI是Java平台的标准组成部分,它提供了一套接口,使得Java代码...

    Android Native TCP C语言实现Server创建和Client连接

    这可以通过JNI的异步回调机制实现,将网络事件通知给Java层。 8. **安全性和错误处理** 在实际应用中,我们还需要考虑安全性问题,如使用SSL/TLS加密通信,防止中间人攻击。此外,对网络异常、资源泄露等错误情况...

    Android的JNI【实战教程】6⃣️--温控计

    JNI接口提供了Java与本地代码之间的桥梁,包括从Java到本地代码的调用(JNI函数调用)和从本地代码回调Java方法(本地方法)。在我们的温控计应用中,我们将使用C语言编写本地代码,负责获取设备温度数据(此处以...

    Android C++高级编程:使用NDK_Onur Cinar, 于红PDF电子书下载 带书签目录 完整版

    4.8.4 重写回调方法 109 4.8.5 更新HelloJni Activity 110 4.9 小结 110 第5章 日志、调试及故障处理 111 5.1 日志 111 5.1.1 框架 111 5.1.2 原生日志API 112 5.1.3 受控制的日志 114 5.1.4 控制台日志 118...

    NDK从入门到精通CSDN

    - C语言回调Java方法示例程序:[GitHub](https://github.com/han1202012/NDK_Callback.git) 开发环境配置包括: - **Eclipse**: ADT Bundle for Windows 20130917 - **SDK**: 版本2.3.3 - **NDK**: Android NDK r9...

    AndroidStudio 3.1 使用libpcap示例

    你可以定义一个处理函数,在回调中解析数据包并进行分析。 8. **调试与测试**:由于涉及到原生代码,调试可能比纯Java应用更复杂。你可以使用NDK的gdb调试器,或者通过打印日志来查看程序运行情况。 通过以上步骤...

    使用android的binder机制,进行RPC,使用C语言接口编程.zip

    在Android中,Binder机制可以被用来实现RPC。通过Binder,我们可以创建跨进程的服务,使得客户端可以通过接口调用服务端的方法,就像调用本地方法一样。 三、C语言接口编程 Android系统主要是用Java开发的,但为了...

    pro_android_cpp_with_the_ndk.pdf

    4.8.4 重写回调方法 4.8.5 更新HeIIojniActivity 4.9 小结 第5章 日志、调试及故障处理 5.1 日志 5.1.1 框架 5.1.2 原生日志API 5.1.3 受控制的日志 5.1.4 控制台日志 5.2 调试 5.2.1 预备知识 5.2.2 调试会话建立 ...

    android串口调用,使用c开发的,可以设置串口超时

    - Android NDK允许开发者在Android应用中使用C/C++代码,通过Java Native Interface (JNI)与Java层交互。首先,你需要在Android项目中集成NDK,创建一个jni目录存放C/C++源码,并在Java代码中定义JNI接口。 2. **...

    NDK用于网络编程的类

    3. **异步网络编程**:在Android NDK中,可以使用线程或异步回调机制来处理网络I/O操作,避免阻塞主线程。例如,可以创建单独的线程来处理网络请求,保持用户界面的流畅性。或者使用libevent、libuv这样的库来实现...

    android音频解码libmad.so动态库

    5. **解码逻辑**:在JNI层,开发者需要编写解码函数,这些函数调用libmad库的API,处理MP3帧,将其解码成PCM数据,然后通过JNI回调到Java层。 6. **音频流处理**:解码后的PCM数据可以通过Android的AudioTrack或...

    RS485-jni驱动代码

    例如,应用可能先调用初始化函数设置串口参数,然后发送数据到RS485总线,并通过接收回调函数处理接收到的数据。同时,由于接口设计得可扩展,开发者可以根据需要添加新的功能,比如错误检测机制、流量控制等。 总...

    libcurl安卓通信库支持https

    在应用中使用libcurl时,需要初始化libcurl会话,设置URL、请求方法、头信息等参数,并指定回调函数来处理接收的数据。对于HTTPS,还需要确保libcurl知道如何处理证书验证,这可以通过设置CURLOPT_SSL_VERIFYPEER和...

    libevent for android

    这个库的核心思想是事件驱动编程,即当特定的事件发生时,会触发预先设置的回调函数,以此来实现异步非阻塞的编程模型。这在处理大量并发连接时,能有效减少CPU资源的占用,提高系统的响应速度。 二、Android平台上...

    Pjsip注册二次封装后的代码

    4. **Android Studio 集成**:将Pjsip 和 Csipsimple 项目导入到Android Studio,需要解决NDK、JNI以及库依赖等问题。通常,需要配置项目的build.gradle文件,添加必要的依赖库,并确保与Android系统的版本兼容。 5...

    nopoll例子

    在Android环境中使用nopoll,首先需要确保你的开发环境配置正确,包括安装NDK,设置交叉编译工具链,并且配置好Android.mk或者CMakeLists.txt文件以包含nopoll库。Android应用通常使用JNI(Java Native Interface)...

    ijkplayer编译so库

    它支持多种视频和音频格式,提供了灵活的API接口,适用于Android和iOS等移动平台,以及其他支持C语言的系统。在本例中,我们讨论的是ijkplayer编译为动态链接库(SO库)的过程,特别关注的是针对不同Android架构的...

    12_Ophone平台2D游戏引擎实现——物理引擎(一).pdf

    若要在Ophone平台上使用Chipmunk,开发者需要通过JNI(Java Native Interface)调用C语言实现的版本,这涉及NDK(Native Development Kit)的使用,开发和调试难度相对较高,但可以获得更好的性能。 通过一个实际的...

Global site tag (gtag.js) - Google Analytics