不说太罗嗦了,回调分为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的方法,主要涉及以下几个步骤:声明`native`方法、生成JNI头文件、编写C/C++代码、实现回调逻辑、编译本地库以及在Java代码中调用。理解和熟练掌握这些步骤,能够帮助开发者充分利用C/C++的...
本教程将详细介绍如何在Android中使用JNI实现C语言回调Java的方法,包括有参无参、有无返回值以及静态非静态函数的不同情况。 1. **JNI基础概念** JNI是Java平台的标准组成部分,它提供了一套接口,使得Java代码...
这可以通过JNI的异步回调机制实现,将网络事件通知给Java层。 8. **安全性和错误处理** 在实际应用中,我们还需要考虑安全性问题,如使用SSL/TLS加密通信,防止中间人攻击。此外,对网络异常、资源泄露等错误情况...
JNI接口提供了Java与本地代码之间的桥梁,包括从Java到本地代码的调用(JNI函数调用)和从本地代码回调Java方法(本地方法)。在我们的温控计应用中,我们将使用C语言编写本地代码,负责获取设备温度数据(此处以...
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...
- C语言回调Java方法示例程序:[GitHub](https://github.com/han1202012/NDK_Callback.git) 开发环境配置包括: - **Eclipse**: ADT Bundle for Windows 20130917 - **SDK**: 版本2.3.3 - **NDK**: Android NDK r9...
你可以定义一个处理函数,在回调中解析数据包并进行分析。 8. **调试与测试**:由于涉及到原生代码,调试可能比纯Java应用更复杂。你可以使用NDK的gdb调试器,或者通过打印日志来查看程序运行情况。 通过以上步骤...
在Android中,Binder机制可以被用来实现RPC。通过Binder,我们可以创建跨进程的服务,使得客户端可以通过接口调用服务端的方法,就像调用本地方法一样。 三、C语言接口编程 Android系统主要是用Java开发的,但为了...
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 NDK允许开发者在Android应用中使用C/C++代码,通过Java Native Interface (JNI)与Java层交互。首先,你需要在Android项目中集成NDK,创建一个jni目录存放C/C++源码,并在Java代码中定义JNI接口。 2. **...
3. **异步网络编程**:在Android NDK中,可以使用线程或异步回调机制来处理网络I/O操作,避免阻塞主线程。例如,可以创建单独的线程来处理网络请求,保持用户界面的流畅性。或者使用libevent、libuv这样的库来实现...
5. **解码逻辑**:在JNI层,开发者需要编写解码函数,这些函数调用libmad库的API,处理MP3帧,将其解码成PCM数据,然后通过JNI回调到Java层。 6. **音频流处理**:解码后的PCM数据可以通过Android的AudioTrack或...
例如,应用可能先调用初始化函数设置串口参数,然后发送数据到RS485总线,并通过接收回调函数处理接收到的数据。同时,由于接口设计得可扩展,开发者可以根据需要添加新的功能,比如错误检测机制、流量控制等。 总...
在应用中使用libcurl时,需要初始化libcurl会话,设置URL、请求方法、头信息等参数,并指定回调函数来处理接收的数据。对于HTTPS,还需要确保libcurl知道如何处理证书验证,这可以通过设置CURLOPT_SSL_VERIFYPEER和...
这个库的核心思想是事件驱动编程,即当特定的事件发生时,会触发预先设置的回调函数,以此来实现异步非阻塞的编程模型。这在处理大量并发连接时,能有效减少CPU资源的占用,提高系统的响应速度。 二、Android平台上...
4. **Android Studio 集成**:将Pjsip 和 Csipsimple 项目导入到Android Studio,需要解决NDK、JNI以及库依赖等问题。通常,需要配置项目的build.gradle文件,添加必要的依赖库,并确保与Android系统的版本兼容。 5...
在Android环境中使用nopoll,首先需要确保你的开发环境配置正确,包括安装NDK,设置交叉编译工具链,并且配置好Android.mk或者CMakeLists.txt文件以包含nopoll库。Android应用通常使用JNI(Java Native Interface)...
它支持多种视频和音频格式,提供了灵活的API接口,适用于Android和iOS等移动平台,以及其他支持C语言的系统。在本例中,我们讨论的是ijkplayer编译为动态链接库(SO库)的过程,特别关注的是针对不同Android架构的...
若要在Ophone平台上使用Chipmunk,开发者需要通过JNI(Java Native Interface)调用C语言实现的版本,这涉及NDK(Native Development Kit)的使用,开发和调试难度相对较高,但可以获得更好的性能。 通过一个实际的...