转战Android之NDK(jni, c/c++调用java)

c/c++调用java

1. JNI中的调用步骤如下:

//获取JNIEnv实例

//JavaVM *vm

//JNIEnv* env = 0;

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

/***********简单数据对象类型**********/

jclass objJava =(env)->FindClass("java/lang/Object");

jobjectArray args=(env)->NewObjectArray(5, objClass, 0);

//args的操作见表2-2

/*************操作对象类型************/

//1.获取Java类中的实例类

jclass objClass =(env)->FindClass("com/example/hellojni/Hello-jni");

//jclass global_obj

//global_obj = (jclass)(env)->NewGlobalRef(objClass);

//2.获取Java类中实例类的变量

jfieldID javavarid=(env)->GetFieldID(objClass,"var_name","Ljava/lang/String;");

//3.获取Java类中实例类的函数,表2-4

jMethodID javafunId = (env)->GetStaticMethodID(objClass,"fun_name","()Z");

//4.(c/c++)本地函数中调用Java类中的函数

(env)->CallStaticVoidMethod(objClass, javafunId);

//(env)->CallStaticVoidMethod(global_obj, javafunId);

2. DEMO示例(CSDN不能上传RAR吗?DEMO不会传,会的话告知我下),代码段吧:

//c++实现方式

//jstring <-> char*

jstring c2jstring(JNIEnv* env,constchar* pcstr)

{

    int nlength = strlen(pcstr);

    jclass cString = (env)->FindClass("java/lang/String");

    jmethodID mIDStr2Init = (env)->GetMethodID(cString,"<init>", "([BLjava/lang/String;)V");

    jbyteArray bytes = (env)->NewByteArray(nlength);

    (env)->SetByteArrayRegion(bytes, 0, nlength, (jbyte*)pcstr);

    //set jstring's code

    jstring encoding = (env)->NewStringUTF("utf-8");

    //returnjstring

    jstring jstr = (jstring)(env)->NewObject(cString, mIDStr2Init, bytes, encoding);

    return jstr;

}

char*jstring2c(JNIEnv* env, jstring jstr)

{

    char *pcstrbuf = 0;

    jclass cString = (env)->FindClass("java/lang/String");

    jstring encoding = (env)->NewStringUTF("utf-8");

    jmethodID mIDGetBytes = (env)->GetMethodID(clsstring,"getBytes", "(Ljava/lang/String;)[B");

    jbyteArray arrbytes = (jbyteArray)(env)->CallObjectMethod(jstr, mIDGetBytes, encoding);

    jsize arrlen = (env)->GetArrayLength(arrbytes);

    jbyte* bytes = (env)->GetByteArrayElements(arrbytes, JNI_FALSE);

    if (arrlen > 0)

    {

       pcstrbuf = (char*)malloc(arrlen + 1);

       memcpy(pcstrbuf, bytes, arrlen);

       pcstrbuf[arrlen] = 0;

    }

    (env)->ReleaseByteArrayElements(arrbytes, bytes, 0);

    return pcstrbuf;

}

//jstring <-> wchar_t*

jstring js2w(JNIEnv* env, unsigned short* str)

int nlength = wcslen(pwcstr);

    jchar* bytes = (jchar*)malloc(sizeof(jchar)*(nlength+1));

    memcpy(bytes, pwcstr, sizeof(jchar)*nlength);

    bytes[nlength] = 0;

    jstring jstr = (env)->NewString(bytes, nlength);

    free(bytes);

    return jstr;

}

unsigned short * w2js(JNIEnv* env, jstring str)

    int nlength = (env)->GetStringLength(jstr);

    unsigned short *pwcstr = (unsigned short *)malloc(sizeof(unsigned short)*(nlength+1));

    memset(pwcstr, 0, sizeof(unsigned short)*(nlength+1));

    wchar_t *pwcbytes = (unsigned short *)(env)->GetStringChars(jstr, 0);

    memcpy(pwcstr, pwcbytes, nlength*sizeof(unsigned short));

    (env)->ReleaseStringChars(jstr, pwcbytes);

    return pwcstr;       

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值