不说太罗嗦了,回调分为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));
}
怎么样?不是很难吧?具体能不能理解,就看大家的编程经验怎么样了?
相关推荐
安卓app开发之Android JNI即NDK C语言开发教程,适合初学者
Android通过JNI实现与C语言的串口通讯操作蓝牙硬件模块.pdfAndroid通过JNI实现与C语言的串口通讯操作蓝牙硬件模块.pdfAndroid通过JNI实现与C语言的串口通讯操作蓝牙硬件模块.pdfAndroid通过JNI实现与C语言的串口通讯...
通过JNI接口静态注册的native方法去创建线程,同时提供native回调Java的方法。通过这个框架可以去实现线程监听某一个状态,然后回调Java的方法(如发消息去通知顶层,实现显示)
Android NDK 开发时需要的 常用的JNI API
Android Studio JNI/NDK 编程; 具体见博客: http://blog.csdn.net/q610098308/article/details/51313341
Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例Android NDK JNI 经典实例
Android通过JNI实现与C语言的串口通讯操作蓝牙硬件模块.docxAndroid通过JNI实现与C语言的串口通讯操作蓝牙硬件模块.docxAndroid通过JNI实现与C语言的串口通讯操作蓝牙硬件模块.docxAndroid通过JNI实现与C语言的串口...
Android APP 用interface 接口的形式对jni进行回调,实例测试
C++使用JNI多线程回调java代码例子,因为依赖了我的一些库和头文件,没有传上去,编译不过,但是大家可以参考一下,如何使用C++多线程调用java函数
Android Studio中使用NDK/JNI 的相关代码http://blog.csdn.net/jfzl123/article/details/53436600
JNI调用比较简单,根据JNI给出的实例,本内容主要讲多线程使用回调步骤:主要说明参照我的博文 http://blog.csdn.net/inr12345/article/details/8935350
android jni NDK 经典入门
Android通过NDK调用JNI来调用本地C语言实现的加密算法
Android studio 编译第一个NDK程序的详细教程的代码,附上Android studio编写第一个NDK工程的过程详解文章的链接https://blog.csdn.net/weixin_37639900/article/details/89680670
jni编程c回调java的方法
安卓app开发之NDK入门教程,JAVA代码通过JNI接口调用NDK代码(C语言编写的linux android功能).zip
AndroidStudio环境下的jni调用(NDK),这个教程可以让完全不会AndroidStudio的人学会jni调用。完全步骤话,非常简单。
jni ndk 编程
JNI NDK 开发指南 对JNI有个初步的认识,里面涉及必要的函数说明
Java通过JNI调用C语言函数库的方法