浏览 4743 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-09-19
1、主要流程
1、 String 字符串传输
2、 自定义对象的传输
2设计实现 1、 界面设计如下: 代码不在这贴出了,有需要的兄弟直接到文章结束部分下载。 2、 关键代码说明 Transmission.java package com.duicky; /** * * <p> * Title: aa.java * </p> * <p> * E-Mail: 176291935@qq.com * </p> * <p> * QQ: 176291935 * </p> * <p> * Http: iaiai.iteye.com * </p> * <p> * Create time: 2011-9-19 * </p> * * @author 丸子 * @version 0.0.1 */ public class Transmission { private static final String libSoName = "NDK_07"; public native String transferString(String mStrMSG); public native Object transferPerson(Person mPerson); /** * 载入JNI生成的so库文件 */ static { System.loadLibrary(libSoName); } } MainActivity.java package com.duicky; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; /** * * <p> * Title: MainActivity.java * </p> * <p> * E-Mail: 176291935@qq.com * </p> * <p> * QQ: 176291935 * </p> * <p> * Http: iaiai.iteye.com * </p> * <p> * Create time: 2011-9-19 * </p> * * @author 丸子 * @version 0.0.1 */ public class MainActivity extends Activity { //也就是你mk配置文件中的 LOCAL_MODULE := NDK_06 private Context mContext = null; private Transmission mTransmission = null; private Button btnString = null; private Button btnPerson = null; private TextView tvString = null; private TextView tvPerson = null; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mContext = this; mTransmission = new Transmission(); initViews(); } /** * 初始化控件 */ private void initViews() { btnString = (Button) findViewById(R.id.btn_string); btnPerson = (Button) findViewById(R.id.btn_person); tvString = (TextView) findViewById(R.id.tv_string); tvPerson = (TextView) findViewById(R.id.tv_person); btnString.setOnClickListener(new MyOnClickListener()); btnPerson.setOnClickListener(new MyOnClickListener()); } private void transferString() { String mStrMSg = mTransmission.transferString(" This Message come from Java "); LogUtils.printWithSystemOut(mStrMSg); tvString.setText(mStrMSg); } private void transferPerson() { Person mPerson = new Person(); mPerson.setAge(10); mPerson.setName("duicky"); Person mPerson1 = (Person)mTransmission.transferPerson(mPerson); if(mPerson1 == null) { LogUtils.printWithSystemOut("error"); tvPerson.setText("传递出现错误,请重试"); return; } LogUtils.printWithSystemOut(mPerson1.toString()); tvPerson.setText("Java --- > "+mPerson1.toString()); } class MyOnClickListener implements OnClickListener{ @Override public void onClick(View v) { switch(v.getId()) { case R.id.btn_string: transferString(); break; case R.id.btn_person: transferPerson(); break; } } } } TransmissionPerson.c #include <string.h> #include <jni.h> #include <android/log.h> extern JNIEnv* jniEnv; jclass Person; jobject mPerson; jmethodID getName; jmethodID setName; jmethodID getAge; jmethodID setAge; jmethodID toString; int InitPerson(); void ToString(); void GetName(); void GetAge(); void SetName(); void SetAge(); //---------------------------------------------------------------- //---------------------------------------------------------------- //---------------------------------------------------------------- jobject Java_com_duicky_Transmission_transferPerson( JNIEnv* env,jobject thiz,jobject person ) { if(jniEnv == NULL) { jniEnv = env; } if (Person == NULL || getName == NULL || setName == NULL || getAge == NULL || setAge == NULL || toString == NULL) { if (1 != InitPerson()) { return NULL; } } mPerson = person; if(mPerson == NULL) { return NULL; } GetName(); GetAge(); ToString(); __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "Begin Modify mPerson .... " ); SetName(); SetAge(); ToString(); return mPerson; } //---------------------------------------------------------------- //---------------------------------------------------------------- //---------------------------------------------------------------- /** * 初始化 类、方法 */ int InitPerson() { __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin " ); if(jniEnv == NULL) { return 0; } if(Person == NULL) { Person = (*jniEnv)->FindClass(jniEnv,"com/duicky/Person"); if(Person == NULL){ return -1; } __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin 2 ok" ); } if (getName == NULL) { getName = (*jniEnv)->GetMethodID(jniEnv, Person, "getName","()Ljava/lang/String;"); if (getName == NULL) { (*jniEnv)->DeleteLocalRef(jniEnv, Person); return -2; } __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin 4 ok" ); } if (setName == NULL) { setName = (*jniEnv)->GetMethodID(jniEnv, Person, "setName","(Ljava/lang/String;)V"); if (setName == NULL) { (*jniEnv)->DeleteLocalRef(jniEnv, Person); (*jniEnv)->DeleteLocalRef(jniEnv, getName); return -2; } __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin 4 ok" ); } if (getAge == NULL) { getAge = (*jniEnv)->GetMethodID(jniEnv, Person, "getAge","()I"); if (getAge == NULL) { (*jniEnv)->DeleteLocalRef(jniEnv, Person); (*jniEnv)->DeleteLocalRef(jniEnv, getName); (*jniEnv)->DeleteLocalRef(jniEnv, setName); return -2; } __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin 4 ok" ); } if (setAge == NULL) { setAge = (*jniEnv)->GetMethodID(jniEnv, Person, "setAge","(I)V"); if (setAge == NULL) { (*jniEnv)->DeleteLocalRef(jniEnv, Person); (*jniEnv)->DeleteLocalRef(jniEnv, getName); (*jniEnv)->DeleteLocalRef(jniEnv, setName); (*jniEnv)->DeleteLocalRef(jniEnv, getAge); return -2; } __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin 4 ok" ); } if (toString == NULL) { toString = (*jniEnv)->GetMethodID(jniEnv, Person, "toString","()Ljava/lang/String;"); if (toString == NULL) { (*jniEnv)->DeleteLocalRef(jniEnv, Person); (*jniEnv)->DeleteLocalRef(jniEnv, getName); (*jniEnv)->DeleteLocalRef(jniEnv, setName); (*jniEnv)->DeleteLocalRef(jniEnv, getAge); (*jniEnv)->DeleteLocalRef(jniEnv, setAge); return -2; } __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson Begin 4 ok" ); } __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "InitPerson End" ); return 1; } /** * GetName 对应Person的getName方法 */ void GetName() { if(Person == NULL || getName == NULL) { if(1 != InitPerson()){ return; } } jstring jstr = NULL; char* cstr = NULL; //调用方法 jstr = (*jniEnv)->CallObjectMethod(jniEnv, mPerson, getName); cstr = (char*) (*jniEnv)->GetStringUTFChars(jniEnv,jstr, 0); __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "getName ---- > %s",cstr ); //释放资源 (*jniEnv)->ReleaseStringUTFChars(jniEnv, jstr, cstr); (*jniEnv)->DeleteLocalRef(jniEnv, jstr); } /** * GetAge 对应Person的getName方法 */ void GetAge() { if(Person == NULL || getName == NULL) { if(1 != InitPerson()){ return; } } //调用方法 jint age = (*jniEnv)->CallIntMethod(jniEnv, mPerson, getAge); __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "getAge ---- > %d",age ); } /** * SetName 对应Person的setName方法 */ void SetName() { if(Person == NULL || setName == NULL) { if(1 != InitPerson()){ return; } } jstring jstr = (*jniEnv)->NewStringUTF(jniEnv, "Modify Name"); //调用方法 (*jniEnv)->CallVoidMethod(jniEnv, mPerson, setName,jstr); (*jniEnv)->DeleteLocalRef(jniEnv, jstr); } int age = 20; /** * SetAge 对应Person的setAge方法 */ void SetAge() { if(Person == NULL || setAge == NULL) { if(1 != InitPerson()){ return; } } //调用方法 (*jniEnv)->CallVoidMethod(jniEnv, mPerson, setAge,age++); } /** * ToString 对应 Person 的 toString 方法 , 打印出相关信息 */ void ToString() { if(Person == NULL || toString == NULL) { if(1 != InitPerson()){ return; } } jstring jstr = NULL; char* cstr = NULL; //调用方法 jstr = (*jniEnv)->CallObjectMethod(jniEnv, mPerson, toString); cstr = (char*) (*jniEnv)->GetStringUTFChars(jniEnv,jstr, 0); __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "C JNI toString ---- > %s",cstr ); (*jniEnv)->ReleaseStringUTFChars(jniEnv, jstr, cstr); (*jniEnv)->DeleteLocalRef(jniEnv, jstr); } TransmissionString.c #include <string.h> #include <jni.h> #include <android/log.h> JNIEnv* jniEnv; jstring Java_com_duicky_Transmission_transferString( JNIEnv* env,jobject thiz,jstring msg ) { if(jniEnv == NULL) { jniEnv = env; } char data[128]; memset(data, 0, sizeof(data)); char *c_msg = NULL; c_msg = (char *)(*jniEnv)->GetStringUTFChars(jniEnv, msg, 0); __android_log_print(ANDROID_LOG_INFO, "JNIMsg", "C JNI ---- > %s",c_msg); return (*jniEnv)->NewStringUTF(jniEnv, "This is send by C JNI"); } 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-09-23
这个干什么使呢?
|
|
返回顶楼 | |
发表时间:2011-09-29
这个还是比较初级的,JNI刚入门的。不过分享精神可佳!
|
|
返回顶楼 | |
发表时间:2012-08-10
感谢分享
|
|
返回顶楼 | |