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
jobjectgJniObj;
jclassgJniClass;
jmethodIDgJinMethod;


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));
}
怎么样?不是很难吧?具体能不能理解,就看大家的编程经验怎么样了?

更多相关文章

  1. Android一键锁屏代码
  2. Android截屏实现——亲测有效代码
  3. Android——多语言适配
  4. [置顶] Android SDK中的例子的源代码
  5. Android 源代码在线查看(转)
  6. Android中获取网页表单中的数据实现思路及代码

随机推荐

  1. Android Weekly Notes Issue #232
  2. Android开发中怎样调用系统Email发送邮件
  3. 用kotlin打印出漂亮的android日志(三)—
  4. android 修改窗体标题的字体式样和…
  5. Android(安卓)Matrix Riot (IM)SDK 集成专
  6. 实现Android简单动画旋转案例源码
  7. Android中通过xml给布局添加边框
  8. 安装Termux的手机上运行Python
  9. Android侧滑控件之DrawerLayout的使用
  10. Android获取控件宽高的几种方式