六、Android学习笔记_JNI_c调用java代码

来源:互联网 发布:知乎神经性耳鸣5年 编辑:程序博客网 时间:2024/04/30 03:39

六、Android学习笔记_JNI_c调用java代码

1、编写native方法(java2c)和非native方法(c2java):

复制代码
复制代码
package com.example.provider;public class CallbackJava {    // C调用java空方法    public void helloFromJava() {        System.out.println("hello from java");    }    // C调用java中的带两个int参数的方法    public int Add(int x, int y) {        int result = x + y;        System.out.println("java result=" + result);        return result;    }    // C调用java中参数为string的方法    public void printString(String s) {        System.out.println("java " + s);    }    //静态方法    public static void printStaticStr(String s) {        System.out.println("java static-> " + s);    }    // 让c代码调用对应的java代码    public native void callHelloFromJava();    public native void callAdd();    public native void callPrintString();    // 调用一个静态的c代码    public native void callPrintStaticStr();}
复制代码
复制代码

2、通过javah命令生成签名,通过javap命令生产native方法签名:

  

3、c代码

FindClass:找到java中的类文件
GetMethodID:根据类和方法签名找到要调用的方法。
复制代码
复制代码
#include <stdio.h>#include <jni.h>#include <malloc.h>#include "com_example_provider_CallbackJava.h";#include "com_example_jni_MainActivity.h";#include <android/log.h>#define LOG_TAG "System.out.c"#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)jmethodID getMethodId(JNIEnv * env, char* methodname, char* signname) {    jclass jclazz = (*env)->FindClass(env, "com/example/provider/CallbackJava");    if (jclazz == 0) {        LOGD("class not find ");        return;    }    //2、找class中方法的id,第三个参数方法名称,第四个参数该方法对应的签名    jmethodID methodid = (*env)->GetMethodID(env, jclazz, methodname, signname);    if (methodid == 0) {        LOGD("method not find ");        return;    }    return methodid;}JNIEXPORT void JNICALL Java_com_example_provider_CallbackJava_callHelloFromJava(JNIEnv * env, jobject obj) {    //1、 找java中的class文件    //第二个参数是类名的(包名)    jclass jclazz = (*env)->FindClass(env,"com/example/provider/CallbackJava");    if(jclazz==0) {        LOGD("class not find ");        return;    }    //2、找class中方法的id,第三个参数方法名称,第四个参数该方法对应的签名    jmethodID methodid = (*env)->GetMethodID(env, jclazz,"helloFromJava","()V");    if(methodid==0) {        LOGD("helloFromJava method not find ");        return;    }    //3、调用方法    //void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);    (*env)->CallVoidMethod(env,obj,methodid);}JNIEXPORT void JNICALL Java_com_example_provider_CallbackJava_callAdd(JNIEnv *env, jobject obj) {    jmethodID mid = getMethodId(env,"Add","(II)I");    int result = (*env)->CallIntMethod(env, obj, mid,3,6);    LOGD("c to java add: d%",result);}JNIEXPORT void JNICALL Java_com_example_provider_CallbackJava_callPrintString(JNIEnv *env, jobject obj) {    LOGD("c to java callPrintString start ");    jmethodID mid = getMethodId(env,"printString","(Ljava/lang/String;)V");    (*env)->CallVoidMethod(env, obj, mid,(*env)->NewStringUTF(env," call printString finish"));    LOGD("c to java callPrintString finish ");}JNIEXPORT void JNICALL Java_com_example_provider_CallbackJava_callPrintStaticStr(JNIEnv *env, jobject obj) {    jclass jclazz = (*env)->FindClass(env, "com/example/provider/CallbackJava");    if (jclazz == 0) {        LOGD("class not find ");        return;    }    //静态方法调用GetStaticMethodID 和 CallStaticXXXMethod    jmethodID methodid = (*env)->GetStaticMethodID(env, jclazz, "printStaticStr", "(Ljava/lang/String;)V");    if (methodid == 0) {        LOGD("printStaticStr method not find ");        return;    }    (*env)->CallStaticVoidMethod(env, jclazz, methodid,(*env)->NewStringUTF(env,"static hello java"));}JNIEXPORT void JNICALL Java_com_example_jni_MainActivity_callProvider  (JNIEnv *env, jobject obj){    jclass jclazz = (*env)->FindClass(env,"com/example/provider/CallbackJava");    if(jclazz==0) {        LOGD("class not find ");        return;    }    jmethodID methodid = (*env)->GetMethodID(env, jclazz,"helloFromJava","()V");    if(methodid==0) {        LOGD("helloFromJava method not find ");        return;    }    //创建一个CallbackJava对象    jobject jobj =(*env)->AllocObject(env, jclazz);    (*env)->CallVoidMethod(env,jobj,methodid);}
复制代码
复制代码

    4、编译多个c文件可以用空格分开

复制代码
复制代码
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    :=Hello#LOCAL_SRC_FILES :=Hello.cLOCAL_SRC_FILES :=CallbackJava.c Hello.cLOCAL_LDLIBS += -lloginclude $(BUILD_SHARED_LIBRARY)
复制代码
复制代码
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2岁宝宝断奶粉怎么办 2岁宝宝夜奶频繁怎么办 宝宝15个月还在吃夜奶怎么办 宝宝两岁四个月还吃母乳怎么办 宝宝睡前老是找奶吃怎么办 宝宝戒奶晚上哭怎么办 宝宝戒奶半夜哭怎么办 吸习惯母乳不吸奶嘴怎么办 八个月宝宝奶睡怎么办 宝宝要吸着奶睡怎么办 戒母乳胸胀的疼怎么办 断奶孩子晚上哭的厉害怎么办 喜欢咬指甲的人怎么办? 成年了还咬指甲怎么办 戒奶乳房有硬块怎么办 戒奶七天有硬块怎么办 两岁宝宝喘气粗怎么办 两岁宝宝断不了奶怎么办 两岁宝宝不愿意喝奶粉怎么办 吃母乳不愿意吃奶粉怎么办 母乳宝宝不愿意喝奶粉怎么办 宝宝断母乳不喝奶粉怎么办 9个月宝宝不会爬怎么办 孩子五年级学习成绩差该怎么办 孩子临近中考学习成绩很差该怎么办 初中生成绩不好家长该怎么办 成绩差该怎么办贴吧 宝宝只会匍匐爬怎么办 一年级的孩子数学不好怎么办 小学一年级孩子数学不好怎么办 孩子上一年级数学太差怎么办 智商低情商也低怎么办? 孩子字写得很大怎么办 孩子拿笔重 写字太黑 怎么办 孩子语文成绩好数学不行怎么办? 孩子现在二年级特别叛逆怎么办 孩子又笨又蠢怎么办 四年级孩子数学计算能力差怎么办 孩子四年级数学理解能力差怎么办 孩子小学四年级数学很差怎么办 孩子做作业太慢怎么办