首页 > 其他分享 >android native jni 代码

android native jni 代码

时间:2023-05-08 22:32:22浏览次数:32  
标签:obj jvm char book env android jclass jni native


数组的常用操作: 


 

对象的常用操作: 





另外 




这个里面 有JNI各个方法的说明  可以当做api 



2、

  1. 推荐一个网址 里面关于jni的学习内容比较多  


 

 

===============================================================================================================
//找到类文件
jclass  objectClass = (*env)->FindClass(env, "com.lp.MailInfo");
//或者 obj 参数表示要你想要得到类型的类对象。 
jclass class_Field = (*env)->GetObjectClass(env,obj);   

//得到构造函数
jmethodID mid_date = (*env)->GetMethodID(env,objectClass, "<init>", "()V");
//生成对象
jobject o = (*env)->NewObject(env,jclass,jmethod);
//jclass类 构造方法 后面的就是构造方法的参数  可以没有  

例如 
jobject     book;  
jclass      class_book;   
jmethodID  md_book;   
class_book = (*env)->FindClass(env,"LBook1;");   
md_book = (*env)->GetMethodID(env,class_book,"<init>","(IILjava/lang/String;)V");  
book = (*env)->NewObject(env,class_book,md_book,100,1,"huanghe");  


===============================================================================================================

表 3-2 Java虚拟机类型签名 
类型签名 Java 类型
Z boolean 
B byte
C char
S short
I int
J long 注意 这个是J
F float
D double
L fully-qualified-class ; 全限定的类
[type type[] 
(arg-types)ret-type 方法类型
例如,Java 方法:
    long fun(int n, String s, int[] arr);
具有以下类型签名:
    (ILjava/lang/String;[I)J

	
属性
访问对象实例域的相关函数如下: 
jfieldID GetFieldID(JNIEnv *env, jclass cl, const char name[], const char sig[]) 获取实例对象的域ID
该函数返回一个域的标识符。各参数含义如下: 
env JNI 接口指针;cl 类对象 ; name 域名; sig 编码的域签名 

XXX GetXXXField(JNIEnv *env, jobject obj, jfieldID id) 
该函数返回域的值。域类型XXX是Object, Boolean, byte, char , short, int ,long ,float, double 中类型之一。 
参数 env JNI借口指针;obj为域所在对象;id为域的标识符。 
void SetXXXField(JNIEnv *env,jobject obj, jfieldID id, XXX value) 

例如:

//招到类中名为"topic"的string类型的属性
jfieldID topicFieldId = (*env)->GetFieldID(env, objectClass,"topic", "Ljava/lang/String;");
jstring str = (*env)->GetStringField(env,obj,topicFieldId);
jfieldID ival = (env)->GetFieldID(objectClass,"serial","I");
(env)->SetIntField(obj,ival,10);


方法


得到方法id
static jmethodID message;
static jmethodID audio;
static jmethodID video;

video = (*env)->GetMethodID(env,ljls,"video_data_cb","([BI)I"); 
audio = (*env)->GetMethodID(env,ljls,"audio_data_cb","([BI)I");  
message = (*env)->GetMethodID(env,ljls,"message_cb","(SI)I");

调用方法
int ret = (*env)->CallIntMethod(env,g_meida_obj,audio,jarray,size); 
env obj对象 方法id 参数

静态方法 不推荐调用
GetStaticMethodID


===============================================================================================================
jbyteArray 转换为unsigned char *
unsigned char *src;

jbyte *arr = (*env)->GetByteArrayElements(env,yuvBuf,0);
src = (char *)arr;

unsigned char *转换为jbyteArray
unsigned char *dst;
jbyte *byte = (jbyte*)dst;
jbyteArray rgbBuf = (*env)->NewByteArray(env,width*height*3);
(*env)->SetByteArrayRegion(env,rgbBuf, 0, width*height*3, byte);
//释放
(*env)->ReleaseByteArrayElements(env,yuvBuf,arr,0);

===============================================================================================================
让object成为全局变量

1、定义全局变量
static jobject g_meida_obj;
2、声明全局变量
g_meida_obj = (*env)->NewGlobalRef(env,obj);

貌似用jmethodID不需要特殊设置 直接定义复制即可

===============================================================================================================

关于线程

1、定义全局变量

static JavaVM	*g_jvm;

2、赋值

(*env)->GetJavaVM(env,&g_jvm);

3、你在需要用的地方 特别是不是jni的方法 要想使用当前线程的JNIEnv 

JNIEnv *env;
(*g_jvm)->AttachCurrentThread(g_jvm,&env, NULL);	
。。。。。。
(*g_jvm)->DetachCurrentThread(g_jvm);


===============================================================================================================
回收内存

jclass cls =  env->FindClass("sinashow1android/info/BlackIPUserInfo");
jobject black_ip_obj = env->NewObject(cls,construction_id);

//回收局部对象的内存
env->DeleteLocalRef(black_ip_obj);
env->DeleteLocalRef(cls);

线程处理是 需要放开
(*g_jvm)->DetachCurrentThread(g_jvm);


===============================================================================================================
char 转换为 string
jstring chartojstring(JNIEnv *env, const char *chars)
	{
		jstring result;
		jint len = strlen(chars);
		if(len <= 0)
		{
			result = env->NewStringUTF("");
			return result;
		}

		jclass stringClass;
		jmethodID cid;
		jbyteArray elemArr;
		jstring jencoding;

		stringClass = env->FindClass("java/lang/String");
		if (stringClass == NULL) {
			return NULL; 
		}

		cid = env->GetMethodID(stringClass,"<init>", "([BLjava/lang/String;)V");
		if (cid == NULL) {
			return NULL; 
		}

		jencoding = env->NewStringUTF("GBK");
		elemArr = env->NewByteArray(len);
		if (elemArr == NULL) {
			return NULL; 
		}
		env->SetByteArrayRegion(elemArr, 0, len, (jbyte*)chars);
		result = (jstring)(env->NewObject(stringClass, cid, elemArr, jencoding));
		env->DeleteLocalRef(elemArr);
		env->DeleteLocalRef(stringClass);
		env->DeleteLocalRef(jencoding);
		return result;
	}

标签:obj,jvm,char,book,env,android,jclass,jni,native
From: https://blog.51cto.com/u_2198048/6256345

相关文章

  • Android系统中自带的图标&一些预定义样式&参考颜色值
    Android系统中自带了很多图标,我们的程序可以方便使用。Android™1.5android.R.drawableIconResourceshttp://since2006.com/android/1.5-drawables.phpAndroid™1.6android.R.drawableIconResourceshttp://since2006.com/android/1.6-drawables.ph......
  • Android学习之RecyclerView
    RecyclerView是android-support-v7-21版本中新增的一个Widget,官方介绍RecyclerView是ListView的升级版本,更加先进和灵活。开发环境 -IDE:ADT -SDK:AndroidL首先在AndroidSDKManager上下载AndroidSupportRepository,它会在sdk/extras/android目录下生成m2reposito......
  • Android5.0 v7扩展包之RecyclerView
    Android5.0v7扩展包之RecyclerViewAndroid开发文章 androidRecyclerViewRecyclerView。RecylerView简介TheRecyclerViewwidgetisamoreadvancedandflexibleversionofListView.ThiswidgetisaContainerfordisplayinglargedatasetsthatcanbescrolledvery......
  • Android Studio相关问题
    下载去官网下载即可,最新版如果运行不了,可选择安装其他版本,我安装的就是4.0版本建立项目一般就是建立一个空项目如果使用过idea,那么建立项目就很简单。因为Android Studio和idea 界面都差不多,功能也类似步骤:File——New——New Project 会出现以下画面:然后选择Empty......
  • android ffmpeg 打开u3u8地址没有协议
     编译是需要--enable-openssl debug info: '--target-os=android--ln_s='cp-rf'--prefix=/Users/yzfhkms-m/pripro/D/library/FFmpeg-n4.0/libs/arm--arch=arm--enable-hwaccels--enable-shared--enable-static--enable-gpl--enable-runtime-cpudetect......
  • Android Studio系列教程五--Gradle命令详解与导入第三方包
    AndroidStudio+Gradle的组合用起来非常方便,很多第三方开源项目也早都迁移到了Studio,为此今天就来介绍下查看、编译并导入第三方开源项目的方法。Sublime+Terminal编译并查看源码首先来给大家介绍一种简便并且个人最喜欢的一种办法。很多时候我们在GitHub上看到一个不错的开......
  • 史上最详细的Android Studio系列教程四--Gradle基础
    什么是Gradle?Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言。安装Gradle在AndroidStudio系列教程一--下载与安装中新建项目成功后会下载Gradle,貌似这个过程不翻也是可以下载,但是访问......
  • Android Studio系列教程二--基本设置与运行
    上面一篇博客,介绍了Studio的优点与1.0RC的安装与上手体验,没想到google的更新速度这么快,已经出了RC2版本,主要是修复一些bug。那么今天就带大家预览下Stduio的界面与基本功能。项目结构当我们新建一个项目的目录结构默认是这样的可以看到和Eclipse的目录结构有很大区别,Studio一个......
  • Android系统启动-2—Init篇-1
    基于Android6.0的源码剖析,分析Android启动过程进程号为1的init进程的工作内容。主要相关文件:system/core/init/-init.cpp-init_parser.cpp-signal_handler.cpp 一、概述init进程是Linux系统中用户空间的第一个进程,进程号固定为1。Kernel启动后,在用户空......
  • Android NDK 内存泄露检测
     Andorid中Java层代码内存泄露可以借助leakcanary进行检测;C++上的内存泄露检测库LeakTracer,于是再找了下,找到了Android上的移植版。首先建立一个项目,在根目录下建立thirdparty目录,进入该目录,clone相关库代码:[email protected]:lizhangqu/LeakTracer.git在项目src/main/cpp......