public
native
String transferString(String mStrMSG);
public
native
Object transferPerson(Person mPerson);
|
Person.java
package
com.duicky;
/**
*
*
* @author luxiaofeng <454162034@qq.com>
*
*/
public
class
Person {
private
String name;
private
int
age;
public
Person() {
name =
""
;
age =
0
;
}
public
String getName() {
return
name;
}
public
void
setName(String name) {
this
.name = name;
}
public
int
getAge() {
return
age;
}
public
void
setAge(
int
age) {
this
.age = age;
}
@Override
public
String toString() {
return
"Person [name="
+ name +
", age="
+ age +
"]"
;
}
}
|
定义两个native方法, 第一个是 用来 测试传输字符串的的,第二个是用来测试传输自定义对象的。
Android.mk 文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
LOCAL_MODULE := NDK_07
LOCAL_SRC_FILES := \
TransmissionPerson.c \
TransmissionString.c
include $(BUILD_SHARED_LIBRARY)
|
老样子,不说了,你懂的。 如果不懂,嘎嘎,那就请点击Android.mk 文件 简介咯
JNI 中间层
TransmissionString.c // String 传输
#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"
);
}
|
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);
}
|