Android Native方法的调用

Android中Native的创建以及调用
1.创建需要的native方法:

public class Method {

    public static String getUUid(){
        return UUID.randomUUID().toString();
    }

    public native static void callStaticMethod();

    public native static  Point createPoint();
}

之后通过javac -h ./ Method.jav生成需要的头文件(./ 表示当前目录),内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_yppcat_test_Method */

#ifndef _Included_com_yppcat_test_Method
#define _Included_com_yppcat_test_Method
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_yppcat_test_Method
 * Method:    callStaticMethod
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_yppcat_test_Method_callStaticMethod
  (JNIEnv *, jclass);

#ifdef __cplusplus
}
#endif
#endif

将头文件拷贝到cpp目录下,新建对应的.cpp文件并实现相应的方法:

#include "Method.h"
#include <android/log.h>
#include <stdio.h>

extern "C" {
    //先调用native方法,native中再调用java的方法
JNIEXPORT void JNICALL Java_com_yppcat_test_Method_callStaticMethod
        (JNIEnv *env, jclass j_clz) {
    jmethodID j_mid = env->GetStaticMethodID(j_clz, "getUUid", "()Ljava/lang/String;");
    jstring j_uuid = static_cast<jstring>(env->CallStaticObjectMethod(j_clz, j_mid));
    char *uuid = const_cast<char *>(env->GetStringUTFChars(j_uuid, NULL));
    __android_log_print(ANDROID_LOG_ERROR, "allStaticMethod", "c_uuid = %s", uuid);
    printf("c_uuid = %s", uuid);
}

JNIEXPORT jobject JNICALL Java_com_yppcat_test_Method_createPoint(JNIEnv *env, jclass) {
    //调用native方法构造Java对象并返回
    jclass j_clz = env->FindClass("com/yppcat/test/Point");
    jmethodID j_mid = env->GetMethodID(j_clz, "<init>", "(II)V");
    jobject point = env->NewObject(j_clz, j_mid, 11, 22);
    jmethodID j_setY = env->GetMethodID(j_clz, "setY", "(I)V");
    env->CallVoidMethod(point, j_setY, 100);
    return point;
}
}

Point代码如下:

package com.yppcat.test;

public class Point {
    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    private int x;
    private int y;

    public int getX() {
        return x;
    }

    public void setX(int x) {
        this.x = x;
    }

    public int getY() {
        return y;
    }

    public void setY(int y) {
        this.y = y;
    }
}

另外如果用到其他的sdk相关的类,在生成头文件是需要用到以下命令:

javac -h ./ -classpath <sdk全路径> xxx.java
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容