1、Java中装载dll库
System.loadLibrary(String);
本地方法
jint JNI_OnLoad(JavaVM* vm, void* reserved);(返回所需的JVM最低版本,如JNI_VERSION_1_2)
void JNI_OnUnload(JavaVM* vm, void* reserved);
2、基本数据类型对照
Java C 字节
boolean jboolean 1
byte jbyte 1
char jchar 2
short jshort 2
int jint 4
long jlong 8
float jfloat 4
double jdouble 8
JNI_FALSE = 0
JNI_TRUE = 1
3、字符串参数
jstring NewStringUTF(JNIEnv* env, const char bytes[]);
以全0字节结尾的“改良UTF-8”字节序列,返回一个新的Java字符串对象,或NULL
jsize GetStringUTFLength(JNIEnv* env, jstring string);
返回进行UTF-8编码所需的字节个数。(不计算作为终止符的全0字节)
const jbyte* GetStringUTFChars(JNIEnv* env, jstring string, jboolean* isCopy);
返回“改良UTF-8”编码的字符串的指针,或者当不能构建字符数组时返回NULL。直到ReleaseStringUTFChars函数调用前,该指针一直有效。isCopy如果进行了复制,则填入JNI_TRUE,否则填入JNI_FALSE。
void ReleaseStringUTFChars(JNIEnv* env, jstring string, const jbyte bytes[]);
通知虚拟机本地代码不再需要通过bytes访问Java字符串
void GetStringRegion(JNIEnv* env, jstring string, jsize start, jsize length, jchar *buffer);
将一个UTF-16双字节序列从字符串复制到用户提供的缓存中。缓存必须足够长,最坏情况下,要复制3*length个字节。
void GetStringUTFRegion(JNIEnv* env, jstring string, jsize start, jsize length, jchar *buffer);
将一个“改良UTF-8”字符序列从字符串复制到用户提供的缓存中。缓存必须足够长,最坏情况下,要复制3*length个字节。
jstring NewString(JNIEnv* env, const jchar chars[], jsize length);
根据Unicode字符串返回一个新的Java字符串对象,或NULL
env JNI接口指针
chars 以null结尾的UTF-16字符串
length 字符串中字符的个数
jsize GetStringLength(JNIEnv* env, jstring string);
返回字符串中字符的个数
const jchar* GetStringChars(JNIEnv* env, jstring string, jboolean* isCopy);
返回Unicode编码的字符串指针,或NULL。直到ReleaseStringChars函数调用前,该指针一直有效。isCopy如果进行了复制,则填入JNI_TRUE,否则填入JNI_FALSE。
void ReleaseStringChars(JNIEnv* env, jstring string, const jchar chars[]);
通知虚拟机本地代码不再需要通过bytes访问Java字符串
4、访问域
jfieldID GetFieldID(JNIEnv *env, jclass cl, const char name[], const char fieldSignature[]);
返回类中一个域的标识符。fieldSignature 编码签名(见5)
Xxx GetXxxField(JNIEnv *env, jobject obj, jfieldID id);
返回域的值。域类型Xxx是Object、Boolean、Byte、Char、Short、Int、Long、Float、或Double之一
void SetXxxField(JNIEnv *env, jobject obj, jfieldID id, Xxx value);
把某个域设置为一个新值。域类型Xxx是Object、Boolean、Byte、Char、Short、Int、Long、Float、或Double之一
jfieldId GetStaticFieldID(JNIEnv *env, jclass cl , const char name[] , const char fieldsignature[]);
返回某类型的一个静态域的标识符。fieldSignature 编码签名(见5)
Xxx GetStaticXxxField(JNIEnv *env, jclass cl , jfieldID id);
返回某静态域的值
void SetStaticXxxField(JNIEnv *env, jclass cl , jfieldID id , Xxx value);
把某个静态域设置为一个新值
5、编码签名
签名 类型
B byte
C char
D double
F float
I int
J long
S short
V void
Z boolean
[ 数组
例:字符串数组 -> [Ljava/lang/String;
float[][] -> [[F
完整方法签名: (参数类型...)返回值类型
例:接收两个整型参数并返回一个整型参数的方法编码 -> (II)I
例:void print(String s) -> (Ljava/lang/String;)V
例:Employee(java.lang.String, double, java.util.Date) -> (Ljava/lang/String;DLjava/util/Date;)V
查看类的方法签名:javap -s -private Employee
分享到:
相关推荐
android JNI 学习笔记 android JNI 学习笔记.doc
JNI学习笔记,对学习android帮助极大
JNI学习笔记.doc
针对所有初学JNI的人员的一个最全面的笔记,对于有过基础的朋友来说又是一个更好的助手. 省去了你自己去总结的时间,有更多的时间去敲代码. ------------黑马程序员学员-------------------
做为Android JNI还未入门的同志们,我这个总结的文档对你们真的很有用处,几乎大部分常规的Java访问C/C++以及C/C++访问Java的内容都包含在内。
1.C++与java交互基本介绍 2.C++获取java属性值、设置java属性值 3.C++创建java对象 4.C++中数据类型间的转换
集成ndk,一个简单的Jni工程包括个人学习笔记
JNI的学习笔记,多看看,很久没看就忘记了.
项目四 多线程文件下载 25 项目五 Android自定义树形菜单 26 项目六 高仿微信聊天 26 ...学习四 Android and MCU Communication 43 一、 uses USB via FTDI serial card 43 二、 uses Uart(through JNI) 44
本人从网上收集的一些关于JNI学习的资源,呵呵
JNI与Java方法的相互调用学习笔记代码。可以新建一个项目,把其中的c++代码拷贝到native-lib.cpp文件中,修改jni中的方法名即可
jni_demo学习样例,带有文档以及笔记
java 调用DLL 学习笔记,包括 JNI、 JACOB 及JAWIN。 及 dll 查看工具
基于seetaface的人脸识别,本人修改为安卓NDK编译程序,并扩展了,安卓调用接口,包括了检测,对齐,识别,在同一个程序中...本人笔记网址www.abdosoft.cn, 至少可以让你节省1个星期时间,包括jni学习也是很好的参考了。
JNI 编程教程,新手必备 Android JNI/NDK 学习笔记
NULL 博文链接:https://cherishlc.iteye.com/blog/1756762