`

android native jni 代码

 
阅读更多

数组的常用操作: 

 

对象的常用操作: 


 



另外 

1、 

Java代码  收藏代码
  1. http://blog.csdn.net/yang_hui1986527/article/details/6887052  


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

2、
Java代码  收藏代码
  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");  


===============================================================================================================
http://www.cnblogs.com/daniel-shen/archive/2006/10/16/530587.html

表 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;
	}

分享到:
评论
1 楼 doloveme 2012-09-12  
数组的常用操作:



对象的常用操作:






另外

1、
Java代码 
http://blog.csdn.net/yang_hui1986527/article/details/6887052 


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

2、
Java代码 
推荐一个网址 里面关于jni的学习内容比较多 

相关推荐

    AndroidStudio JNIDemo

    博客 AndroidStudio JNI开发(二) Native调用java 和 Native调用Andorid API 的代码

    JniCallback.zip_Android jni_android_jni android_jni callback_jni

    实现了android 应用层和通过JNI层回调函数完成应用与native 本地代码之间的相互访问,对于了解JNI回调函数的用法有帮助

    jni native代码

    最简版native层动态注册代码

    Ogre3d 之使用 Android NativeActivity

    昨天把Ogre3d 编译到Android 平台安装之后,再回头看代码才发现,在Android工程中居然没有Java源文件,从Manifest文件中才知道原来使用的是 NativeActivity 。这一下让我犯糊涂,没有Java文件,没有Activity,那我要...

    Android JNI 知识简介(Java Native Interface )

    Java Native Interface (JNI)标准是 java 平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、 C++ 和汇编...

    myjni.rar_android_jni_native

    本代码是jni开发入门级别代码,非常简单易懂,欢迎大家踊跃下载学习

    Opencv-jni-环境.zip

    Android-opencv-4.3.0版本,里面只有 include文件夹及 jniLibs文件-

    Android Studio使用JNI调用C代码 demo "JniTest"

    这是我的博客&lt; Android Studio使用JNI调用C代码&gt;里面用到的demo 原文地址:http://blog.csdn.net/u013210543/article/details/52103015

    Android下如何通过JNI方法向上提供接口总结

    JNI是Java Native Interface的缩写,即Java本地接口.从Java1.1开始,JNI标准成为Java平台的一部分,它允许java代码和用其它语言编写的代码进行交互.JNI是本地编程接口,它使得在Java虚拟机(VM)内部运行的Java代码能够...

    android 下JNI介绍和应用

    Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言...

    Android JNI调用-文件操作

    Android虚拟机允许你的应用程序源代码通过JNI调用实现本地代码的方法,需要在应用程序中使用关键字native声明一个或多个方法表明该方法是通过本地调用实现的

    Android代码-Android

    Android 本目录下的代码都是来自于我的...JniCallback 演示了如何从Native线程回调Java的函数,相关博文:Android开发实践:JNI层线程回调Java函数示例 JniBuffer 演示了各种从Java端到Native层的Buffer传递方法,相

    Android项目_jni操作指南.rar

    本资源为一份详细的Android项目中的JNI(Java Native Interface)操作指南。JNI是Android中Java与本地代码(如C/C++)进行交互的关键技术,它允许开发者利用原生库实现高性能、底层功能等需求。 这份指南内容涵盖了...

    记录Android studio JNI开发的三种方式(推荐)

    JNI (Java Native Interface)是一套编程接口,用来实现Java代码和其他语言(c、C++或汇编)进行交互。下面通过本文给大家讲解Android studio JNI开发的三种方式,需要的朋友参考下吧

    JNI开发——不同class类中的native本地方法的动态注册

    这是Android中JNI开发中动态注册多个类的native方法,以及分模块化管理不同native的代码.

    andoid平台native 层 gbk2utf8源代码

    andoid平台native 层 gbk2utf8源代码

    Android中实现开机自动启动服务(service)实例

    最近在将 HevSocks5Client 移植到 Android 上了,在经过增加...Java 中调用 native 程序我选择使用 JNI 方式,直接在 JNI_OnLoad 方法中调用 pthread_create 创建个线程跑原来的 main 就行啦。 代码如下:…#if defined

    AndroidStudio_3.0版本JNI开发

    JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地...

    androidnative.pri:在不使用JNI的情况下从Qt调用Android函数

    在不使用JNI的情况下从Qt调用Android函数 它是项目的一个分支,旨在提供一个无需使用JNI即可从Qt / QML访问Android功能的库。 备注:该项目仅支持gradle构建系统。 特征 SystemDispatcher-C ++ / Qt和Java / ...

Global site tag (gtag.js) - Google Analytics