`

2011.12.05(6)——— android JNI学习之五 JNI中常用的方法

阅读更多
2011.12.05(6)——— android JNI学习之五 JNI中常用的方法

参考:http://blog.csdn.net/fontlose/article/details/6600122
http://www.cnblogs.com/daniel-shen/archive/2006/10/16/530587.html
http://blog.csdn.net/yang_hui1986527/article/details/6887052
http://www.cnblogs.com/liangwind/archive/2009/08/26/1925511.html
http://www.cnblogs.com/luxiaofeng54/category/315742.html



===============================================================================================================
//找到类文件
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、
http://blog.csdn.net/yang_hui1986527/article/details/6887052


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

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


http://blog.csdn.net/kangyaping/article/details/6584027




  • 大小: 9.5 KB
  • 大小: 5.7 KB
分享到:
评论

相关推荐

    java读写注册表jar包,com.ice.jni.registry

    META-INF/MANIFEST.MF com.ice.jni.registry.HexNumberFormat.class com.ice.jni.registry.NoSuchKeyException.class com.ice.jni.registry.NoSuchValueException.class com.ice.jni.registry.RegBinaryValue.class ...

    Android--JNI-Device.zip_Android jni_android_jni_jni android

    在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言(如C++或C)编写的代码进行交互。这个“Android--JNI-Device.zip”文件显然是一个关于Android平台上使用JNI与硬件设备...

    jni.zip_Android jni_android_jni_jni android

    总之,"jni.zip_Android jni_android_jni_jni android"中的"jni.pdf"文档应该详细介绍了如何在Android开发中利用JNI技术,涵盖了从基本概念到实际应用的方方面面,是开发者深入理解并熟练运用JNI的重要参考资料。

    Java registry,com.ice.jni.registry

    com.ice.jni.registry.RegMultiStringValue.class com.ice.jni.registry.RegBinaryValue.class com.ice.jni.registry.RegistryException.class com.ice.jni.registry.NoSuchValueException.class ...

    android-jni.zip_Android jni_android_jni_jni android

    6. 调用本地方法:在Java代码中,通过System.loadLibrary("library_name")加载动态链接库,然后就可以调用本地方法了。 三、JNI关键概念 1. JNIEnv指针:JNIEnv是一个指向结构体的指针,包含了调用本地方法所需的...

    JniCallback.zip_Android jni_android_jni android_jni callback_jni

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都非常有用,比如优化性能、使用现有的C/C++库、或者像在这个“JniCallback.zip”文件...

    hello-jni.rar_ android jni_android hello jni_android jni hellojn

    接下来,在jni目录下创建一个头文件(hello-jni.h),定义Java中的本地方法签名: ```c #ifndef HELLO_JNI_H #define HELLO_JNI_H #include &lt;jni.h&gt; JNIEXPORT jstring JNICALL Java_...

    jni.rar_Android jni_JAVA串口 JNI_android_android RS232_jni

    在描述中提到的“jni.rar”压缩包中,包含了一个JNI封装串口通信的实例。这个实例的开发流程大致分为以下几个步骤: 1. **创建JNI接口**:在Java层定义JNI函数,声明要调用的C/C++方法。例如,可以定义一个`...

    Android JNI 调用 Silk 音频编解码包

    在Android平台上,JNI(Java Native Interface)是一种技术,允许Java代码和其他编程语言(如C/C++)进行交互。JNI在很多场景下都是必不可少的,比如性能优化、利用现有的C/C++库或者处理底层硬件操作。在本例中,...

    jni.h头文件

    学习JNI编程时,确保正确配置了Java开发环境,并在C/C++项目中包含`jni.h`头文件是基础步骤。然后,通过理解并使用头文件中定义的数据类型、函数和常量,可以创建本地库,实现Java与本地代码的交互。同时,`jni_md.h...

    jni.zip jni编译jni下载

    在描述中提到的`jni.h`和`jni_md.h`是JNI编程中必不可少的头文件。`jni.h`包含了JNI接口的所有定义,如函数原型、数据类型等,是编写本地方法(Native Methods)的核心。开发者在编写C/C++代码来实现Java中的native...

    AndroidJNI.rar_Android jni_android

    本资料"AndroidJNI.rar_Android jni_android"可能包含一个简单的示例项目——HelloWorld,用于教学如何在Android应用中使用JNI。 首先,我们来理解JNI的基本概念。JNI是一套接口,使得Java虚拟机(JVM)能够调用...

    android--JNI.zip_android_android 驱动_jni_jni android

    JNI允许开发者在Android应用中调用本地方法,从而利用C和C++的强大性能和库来解决特定问题,比如优化计算密集型任务、使用硬件加速或者调用操作系统级别的功能。 JNI在Android开发中的主要用途包括: 1. **性能...

    JNI的两个头文件jni.h和jni_md.h

    3. **实现本地方法**:在生成的C/C++源文件中实现本地方法,这里会用到`jni.h`中定义的各种函数。 4. **编译本地库**:将实现的C/C++代码编译为动态链接库或静态库,依赖于目标平台。 5. **加载本地库**:在Java代码...

    jni.h文件,完美适配ida软件,直接就可以使用。

    在给定的压缩包文件中,包含了一个名为"jni.h"的头文件,这是JNI接口定义的核心部分。 `jni.h`文件是JNI开发的基础,它包含了所有的JNI函数声明和数据类型定义。这个头文件通常被Java本地方法(即用C/C++编写的函数...

    I2CJNI.rar_Android jni_android_android i2c_android i2c通信 JNI_i2c

    综上,"I2CJNI.rar"提供了一个使用Android JNI进行I2C通信的实践案例,对于学习如何在Android平台上通过JNI访问硬件资源,尤其是与I2C设备交互的开发者来说,这是一个宝贵的参考资料。通过研究这个项目,开发者可以...

    DELPHI开发JNI必备 jni.pas

    标题中的"DELPHI开发JNI必备 jni.pas"表明这是一个针对Delphi开发者的资源,其中包含的`jni.pas`文件是用Delphi编写的,目的是支持在Delphi项目中使用JNI来调用本地C/C++库或Java方法。`jni.pas`通常会封装JNI的C...

    Android 学习笔记——利用JNI技术在Android中调用、调试C++代码

    这篇“Android学习笔记——利用JNI技术在Android中调用、调试C++代码”将带你深入理解如何在Android应用中使用JNI来调用C++代码,以及如何进行调试。以下是对这一主题的详细阐述。 1. **JNI简介** JNI是Java平台的...

    android JNI学习三实例

    在这个"android JNI学习三实例"中,我们将深入探讨如何在Android应用开发中使用JNI。 一、JNI简介 JNI是Java平台的一部分,提供了一套接口,让Java代码能够调用本地(native)代码,同时也允许本地代码调用Java对象...

    Android通过JNI调用.so动态库

    Android 通过 JNI(Java Native Interface)调用.so 动态库是 Android 开发中的一种常用技术。JNI 是一种允许 Java 代码与 native 代码之间进行交互的接口。通过 JNI,我们可以在 Android 项目中调用.so 动态库中的 ...

Global site tag (gtag.js) - Google Analytics