jni浅析
来源:互联网 发布:手机淘宝链接打不开 编辑:程序博客网 时间:2024/05/30 23:12
java运行于虚拟机,执行的是java特定的字节码,不是设备的机器指令,为了能与本地代码可交互,android设计了java native interface,简称jni,一般jni库说的是按照jni规则编写的了相应调用接口的c/c++库。jni库中包含调用和被java调用的本地代码函数,被java调用的函数需要按照特定的规则进行声明,比如,在apk源码中声明了一个NativeCaller类,这个类所在package为com. nativecaller,那么声明的jni c/c++接口函数应该如下所示:
JNIEXPORT int JNICALL Java_com_nativecaller_NativeCaller_add(JNIEnv*env1, jobject obj, jint a, jint b,jstring jstr, jbyteArray jchararray)
{
char*str = (char*)env->GetStringUTFChars(jstr,0);
unsignedchar * buff = (unsigned char*)env->GetByteArrayElements(jchararray, 0);
////usestr and buff to do some
env->ReleaseByteArrayElements(jchararray,buff, 0);
env->ReleaseStringUTFChars(jstr, str );
returna+b;
}
c/c++本地代码调用java代码名似乎没有命名限制,在java随便一个类中声明一个类成员函数,声明如下:
public voidgetData (int a, String str,byte[] data,int datalen){
Log.e("info","str:" +str+" data.len="+ data.length +"len="+datalen);
}
然后在c/c++里面这样使用这个函数:
首先从环境获取java函数句柄,
g_CallBackObj =env->NewGlobalRef(context);
g_CallBack_getData =env->GetMethodID(clazz, " getData ", "(ILjava/lang/String;[BI)V");
然后在c/c++调用
void getData (int a, char*str, char*data, intdatalen)
{
Mutex::AutolockautoLock(g_CallbackContextLock);
if(g_CallBackObj!= NULL && g_CallBack_ getData!= NULL)
{
jstringjstr = m_envLocal->NewStringUTF(str);
jbyteArray jBuff = m_envLocal ->NewByteArray(datalen);
m_envLocal ->SetByteArrayRegion(jBuff,0, len, (jbyte*)data);
m_envLocal->CallVoidMethod(g_CallBackObj,g_CallBack_getData, a, jstr, jBuff,datalen);
m_envLocal->DeleteLocalRef(jBuff);
m_envLocal->DeleteLocalRef(jstr);
}
}
其中m_envLocal在执行上面回调的线程启动的地方如下面这样获得:
JNIEnv * m_envLocal;
int status = g_JavaVM->GetEnv((void **)& m_envLocal, JNI_VERSION_1_4);
if(status< 0)
{
status= g_JavaVM->AttachCurrentThread(&m_envLocal, NULL);
if(status< 0)
{
Log("AttachCurrentThreadFailed!!");
returnNULL;
}
}
- jni浅析
- JNI浅析
- 浅析JNI交互技术
- JNI.h文件浅析
- JNI.h文件浅析
- HotSpotVM JNI实现浅析
- jni使用小结浅析
- JNI.h文件浅析
- Java JNI浅析(一)
- Android JNI浅析(1)
- Android JNI浅析(2)
- Android JNI浅析(2)
- Java中的native关键字和JNI浅析
- Android framework层JNI的使用浅析
- Android framework层JNI的使用浅析
- 浅析android下如何通过jni监控wifi(一)
- 浅析android下如何通过jni监控wifi(二)
- 浅析android下如何通过jni监控wifi(三)
- java.lang.OutOfMemoryError: PermGen space及其解决方法
- WPF 自定义图片剪切器 - 头像剪切。你懂得
- 基于IOS的sqlite数据库封装
- pig 问题集锦
- 各种移动GPU压缩纹理的使用方法
- jni浅析
- 人脸性别识别文献阅读笔记(2)
- wamp在服务器win8-64中的配置,使用域名访问
- LintCode-交叉字符串
- [易飞]事务与另一个进程被锁在锁资源上,并且被选做锁牺牲品
- Unable to execute dex: Multiple dex files define Landroid/support/v7/appcompat/R$anim;问题解决
- HDU--5396(区间dp+排列组合)
- Hadoop自动化集群部署脚本
- 指针及地址笔记