JNI访问Java中各方法

不啰嗦直接上代码(在这里贴一部分代码,如果要源码,点击最后的连接去下载)

1.eclipse使用.dll库调用

/*

返回字符给java层

*/

JNIEXPORT jstring JNICALL Java_com_zack_jni_JniDemo_getStringJniOne

(JNIEnv * env, jclass jclz){

return (*env)->NewStringUTF(env, "hello Wrold");

}

/* 返回一个不是static 的*/

JNIEXPORT jstring JNICALL Java_com_zack_jni_JniDemo_getNoStaticString

(JNIEnv * env, jobject jobj){

return (*env)->NewStringUTF(env, "no static ");

}

/* 通过 方法来改变 里面的的值*/

JNIEXPORT jstring JNICALL Java_com_zack_jni_JniDemo_accessField

(JNIEnv * env, jobject jobj){

jclass jcl = (*env)->GetObjectClass(env, jobj);

jfieldID fid = (*env)->GetFieldID(env, jcl, "key", "Ljava/lang/String;");

// 得到key 对应的值

// GetXXXField

jstring jstr=(*env)->GetObjectField(env, jobj, fid);

// jni -> c

char * c_str = (*env)->GetStringUTFChars(env, jstr, NULL);

char tempString[30] = "zack";

strcat(tempString, c_str);

jstring newString = (*env)->NewStringUTF(env, tempString);

(*env)->SetObjectField(env, jobj, fid, newString);

(*env)->ReleaseStringUTFChars(env, newString, c_str);

return newString;

//// jclass

//jclass jclz = (*env)->GetObjectClass(env, jobj);

//// fieldId 属性名称,属性签名

//jfieldID fid = (*env)->GetFieldID(env, jclz, "key", "Ljava/lang/String;");

//// key -> dongNao key

//// 得到key 对应的值

//// GetXXXField

//jstring jstr = (*env)->GetObjectField(env, jobj, fid);

//// jni -> c

//char * c_str = (*env)->GetStringUTFChars(env, jstr, NULL);

//char text[30] = "dongNao";

//// 生成新的字符串 dongNao key

//strcat(text, c_str);

//// C -> jni

//jstring new_str = (*env)->NewStringUTF(env, text);

////setXXXField

//(*env)->SetObjectField(env, jobj, fid, new_str);

//(*env)->ReleaseStringChars(env, new_str, c_str);

//return new_str;

}

/* 改变 java 成的静态值 */

JNIEXPORT void JNICALL Java_com_zack_jni_JniDemo_accessStaticField

(JNIEnv * env, jobject jobj){

jclass jcl = (*env)->GetObjectClass(env, jobj);

jfieldID fid=(*env)->GetStaticFieldID(env, jcl, "count", "I");

jint count = (*env)->GetStaticIntField(env, jobj, fid);

count++;

(*env)->SetStaticIntField(env, jcl, fid, count);

}

// 中文的处理

JNIEXPORT jobject JNICALL Java_com_zack_jni_JniDemo_chineseChars

(JNIEnv * env, jobject jobj,jstring in){

}

AS 动态注册:

static  const JNINativeMethod getMethod[]= {

{

"diff", "(Ljava/lang/String;Ljava/lang/String;I)V", (void *) native_zack_diff

}

,{

"getString","()Ljava/lang/String;",(void*)native_java_str

}

,{

"getNoStaticString","()Ljava/lang/String;",(void*)native_no_static

},

{

"accessField","()Ljava/lang/String;",(void*)change_zack_key

},

{

"chineseChars","(Ljava/lang/String;)Ljava/lang/String;",(void*)getchineseChars

},

{

"acceessConstructor","()Ljava/util/Date;",(void*)zack_getDate

},

{

"getStudentName","()Ljava/lang/String;",(void*)zack_getStudentName

}

};

static int registerNatives(JNIEnv* engv)

{

LOGI("registerNatives begin");

jclass  clazz;

clazz = (*engv) -> FindClass(engv, "com/zack/banner/FileUtils");

if (clazz == NULL) {

LOGI("clazz is null");

return JNI_FALSE;

}

if ((*engv) ->RegisterNatives(engv, clazz, getMethod, NELEM(getMethod)) < 0) {

LOGI("RegisterNatives error");

return JNI_FALSE;

}

return JNI_TRUE;

}

//JNI_OnLoad

JNIEXPORT jint JNI_OnLoad(JavaVM *vm,void* reserved){

LOGI("jni_OnLoad begin");

JNIEnv* env = NULL;

if ((*vm)->GetEnv(vm,(void**) &env, JNI_VERSION_1_4) != JNI_OK) {

LOGI("ERROR: GetEnv failed\n");

return -1;

}

assert(env != NULL);

registerNatives(env);

return  JNI_VERSION_1_4;

}

#include "com_zack_banner_FileUtils.h"#include#include#include "assert.h"#include#define  TAG "zack"

#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)

# define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))

//ava_com_zack_banner_FileUtils_diff

JNIEXPORT void JNICALL native_zack_diff

(JNIEnv * env, jclass jcl, jstring path, jstring pattern_Path, jint file_num) {

LOGI("jni begin");

}

JNIEXPORT jstring JNICALL native_java_str(JNIEnv * env,jclass jcl){

return  (*env)->NewStringUTF(env,"hello zack  static Method");

}

JNIEXPORT jstring JNICALL native_no_static(JNIEnv * env,jobject jobj){

return  (*env)->NewStringUTF(env,"hello zack  not static Method");

}

/* 通过 方法来改变 里面的的值*/

JNIEXPORT jstring JNICALL change_zack_key

(JNIEnv * env, jobject jobj) {

jclass jcl = (*env)->GetObjectClass(env, jobj);

jfieldID fid = (*env)->GetFieldID(env, jcl, "key", "Ljava/lang/String;");

// 得到key 对应的值

// GetXXXField

jstring jstr = (*env)->GetObjectField(env, jobj, fid);

// jni -> c

char *c_str = (*env)->GetStringUTFChars(env, jstr, NULL);

char tempString[30] = "zack";

strcat(tempString, c_str);

jstring newString = (*env)->NewStringUTF(env, tempString);

(*env)->SetObjectField(env, jobj, fid, newString);

(*env)->ReleaseStringUTFChars(env, newString, c_str);

return newString;

}

源码

注意:Android  jni目录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容