您的位置:首页 > 编程语言 > C语言/C++

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

2013-08-19 14:49 381 查看
http://blog.sina.com.cn/s/blog_4b650d650100lw43.html

 

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));
}


如果使用了c++,应该用(env)->CallVoidMethod(gJniObj,gJinMethod,(*env)->NewStringUTF(env, tChars));
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: