android NDK(三) :C/C++代码调用java实例

        c/c++本地代码调用java,一般是本地代码没有接口实现某个功能或者实现起来很麻烦,而java直接有这样的接口。这时候会用到c++ 调用java来获取结果,下面是几个简单的实例

1. java代码:

package com.miles;

import android.content.Context;
import android.provider.Settings;
import android.util.Log;


public class Test {

    static {
        System.loadLibrary("native-lib");
    }

    public static boolean getBoolean()
    {
        return true;
    }

    public static String getString()
    {
        return "String";
    }

    public static int getInt()
    {
        return 666;
    }

    public void onProgress(int progress)
    {
        Log.i("cur progress:"+progress);
    }
 }

2.C++部分:


void getString(JNIEnv *env) {

1. 获取到类   
jclass TestClass= env->FindClass("com/miles/Test");

2. 根据类跟方法名,方法签名获取到方法ID		
jmethodID getString 
            = env->GetStaticMethodID(skeletonClass, "getString", "()Ljava/lang/String;");
jmethodID getBool = env->GetStaticMethodID(skeletonClass, "getBoolean", "()Z");
jmethodID getInt = env->GetStaticMethodID(skeletonClass, "getInt", "()I");

3.根据类,方法ID调用方法,并获取返回值
jstring stringInfo = (jstring)env->CallStaticObjectMethod(skeletonClass, getString);
if(stringInfo == NULL)
{
    LOGE("failed to get getString");
	return false;
}
jboolean boolInfo_ = (jboolean)env->CallStaticBooleanMethod(skeletonClass, getBool);
jint intInfo_ = (jint)env->CallStaticIntMethod(skeletonClass, getInt);


//转成c++的char*型
const char *charInfo= gJNIClassEnv->GetStringUTFChars(stringInfo , 0);

//使用完获取到的值后释放资源
gJNIClassEnv->ReleaseStringUTFChars(stringInfo, charInfo);
}

//************************************************************************************
JNIEnv* gEnv;
jclass  globalClass;
JavaVM* jvm;
void init()
{
    gEnv = env;
    jclass localClass = env->FindClass("com/miles/Test");
    globalClass = reinterpret_cast<jclass>(env->NewGlobalRef(localClass));
    env->GetJavaVM(&jvm); 
}

void native_onProgress(JNIEnv *env)
{
    jvm->AttachCurrentThread(&gEnv, NULL);
    jmethodID mid = (gEnv)->GetMethodID(globalClass, "onProgressUpdate", "(I)V");
    if (mid == NULL) {
        LOGI("get onProgressUpdate method id error!\n");
    }
    jobject jobject = gEnv->AllocObject(globalClass);
    (gEnv)->CallVoidMethod(jobject, mid, (jint)progress);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kevin@1024

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值