Android JNI调用函数命名原则规范

原创 2015年11月20日 07:40:11
package com.test.mytest;
public final class SensorNative {
	static {
		System.loadLibrary("MYJNI");
		Init();	
	} 
	private native static void Init();
	public native static int GetY();
  ...
}
其中,注意native关键字,一个Native Method就是一个java调用非java代码的接口,标识符native可以与所有其它的java标识符(abstract除外)连用.
我们这里的MYJNI是C++文件,在MYJNI.C++文件中:
extern "C" void Java_com.test.mytest_SensorNative_Init(JNIEnv* env, jobject thiz) {
...
}
extern "C" jint Java_com.test.mytest_SensorNative_GetY(JNIEnv* env, jobject thiz) {
return g_y;
}
这里可以看出,在JNI.c++文件中,函数体实现的时候,命名应该是:Java_包名_类名_方法名,参数和返回值应转换为JNI类型,如jint,jboolean.
重点:JNI函数与API
在目前的应用中,我们主要关心的是C/C++数据类型与JNI本地类型之间的转化过程,这个过程某些数据的转换需要使用JNIEnv对象的一系列方法来完成。
1.jstring转换为C风格字符串
char* test = (char*)(*env)->GetStringUTFChars(env,jstring,NULL); 
(*env)->ReleaseStringUTFChars(env, jstring, test); 
记得使用完毕后,应调用release释放资源。  
2.C风格字符串转换为
jstring  char charStr[50]; 
jstring jstr;
jstr = env -> NewStringUTF(charStr); 

3.C语言中获取的一段char*的buffer传递给Java  在jni中new一个byte数组,然后使用(*env)->SetByteArrayRegion(env, bytearray, 0, len, buffer) 操作将buffer拷贝到数组中。这种方式主要是针对buffer中存在“\0”的情况,如果以C风格字符串的方式读入,就会损失“\0”之后的字符

(重中之重)返回值是数组的情况:以jintArray为例,有一系列的操作函数:
GetArrayLength 返回数组中的元素数 
NewIntArray  创建一个指定长度的原始数据类型数组
GetIntArrayElement 返回Int数组的元素
SetIntArrayElement 设置Int数组的元素 
GetIntArrayRegion  将原始数据类型数组中的内容拷贝到预先分配好的内存缓存中
SetIntArrayRegion 设置缓存中数组的值 
ReleaseIntArrayRegion  释放GetIntArrayRegion分配的内存
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

JNI方法命名规则

http://book.51cto.com/art/201305/395887.htm 2.4.2 JNI方法命名规则 Log系统中,JNI实现方法与Java声明方法是不同的。例如,J...

Android JNI --函数调用大全

Chap1:JNI完全手册   最近在公司里做了一个手机的项目,需要JAVA程序在发送短信的时候和第三方的短信服务器连接。短信接口是用C++ 写的。琢磨了三天,大致搞懂了JNI的主体部分。先将心...

Andoid NDK编程 2 - JNI签名规则

Andoid NDK编程 2 - JNI签名规则 Posted on 2015-07-02   |   In Android   |   http://zhixinliu.com/2015/0...

JAVA+jni 包名或方法名中含有下划线(_)的解决方法

原文  http://zhigang.net/2013/08/underline-in-jni.html jni或NDK定义C函数是用下划线(_)作为命名分隔。但如果JAVA包名或方法名里包...

JNI:通过函数名对应表的方式来加载对应的native方法

接上一篇  Eclipse + vs2013 编写第一个 JNI HelloWorld>>  ,读者一定很奇怪我们在HelloWorld.java中定义的private native void pri...

在Android Studio中直接编译C/C++文件

http://blog.csdn.net/yuxiangyunei/article/details/38982815 在AS中打包.so文件很方便,直接在app/src/main目录下新建jni...

android利用JNI调用C++自定义类

找了好久关于android调用C/C++库的文章,但是始终没有一片是关于android利用jni调用C++自定义类的文章,无奈只好看android的源代码,学习android的图形库的实现,因为它的实...

NDK开发 从入门到放弃(四:JNI函数、C与C++调用函数的区别)

JNI入门级函数、C与C++调用JNI函数的区别

Android查看调用函数名与行号等信息的日志类

参考网络上的一些文章,我整理实现了一个日志类,实现如下目标: 1,能实现调试跟踪功能; 2,能打印出类名、方法名、行号; 3,能在发布时很容易的关闭日志输出; 4,简化在书写代码时添加日志的操作: ...
  • lintax
  • lintax
  • 2016年06月10日 16:24
  • 1658

Linux常用系统调用函数.ppt

  • 2015年11月22日 10:58
  • 455KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android JNI调用函数命名原则规范
举报原因:
原因补充:

(最多只允许输入30个字)