JNI 笔记 (总结一些基础的,常用的)
来源:互联网 发布:万人网络营销软件站 编辑:程序博客网 时间:2024/06/03 01:58
看了一些博客的内容,总结常用的。
具体是哪些,懒得去弄了。做个笔记,方便自己。
JNIEnv* env;
(*g_jvm)->GetEnv(g_jvm, (void**)&env, JNI_VERSION_1_4);
}
2)使用javac编译源文件,生成类文件(HelloWorld.class)。 javac xxxx.java
3)使用javah -jni生成C头文件(HelloWorld.h)。 javah -jni XXXXX.class
4)用C、C++实现native方法(HelloWorld.c、HelloWorld.cpp),调用c动态库中的方法。(JNI层)
jfieldID GetStaticFieldID(jclass clazz, const char*name, const char *sign) // 取得静态成员变量的id
jmethodID GetMethodID(jclass clazz, const char *name,constchar *sign) // 取得普通成员函数的id
第一个参数 jclass clazz : 代表我们操作的Class类,我们要从这个类里面取的属性和方法的ID。
第二个参数 const char *name : 这是一个常量字符数组,代表我们要取得的方法名或者变量名。
第三个参数 const char *sig : 这也是一个常量字符数组,代表我们要取得的方法或变量的签名。
我们来看下面的例子,如何来获得属性和方法ID:
public class NativeTest {
public void show(int i){
System.out.println(i);
}
public void show(double d){
System.out.println(d);
}
}
本地代码部分:
//首先取得要调用的方法所在的类的Class对象,在C/C++中即jclass对象
jclass clazz_NativeTest= (*env)->FindClass("com/hxsmart/NativeTest");
//取得jmethodID
jmethodID id_show=(*env)->GetMethodID(clazz_NativeTest,“show”,"???");
上述代码中的id_show取得的jmethodID到底是哪个show方法呢?
(1)基本类型以特定的大写字母表示
(参数1类型签名参数2类型签名参数3类型签名.......)返回值类型签名
注意:
1. 函数名,在签名中没有体现出来
2. 参数列表相挨着,中间没有逗号,没有空格
3. 返回值出现在()后面
例如:
boolean isLedOn(void) ; ()Z
void setLedOn(int ledNo); (I)V
String substr(String str, int idx, int count); (Ljava/lang/String;II)Ljava/lang/String
char fun (int n, String s, int[] value); (ILjava/lang/String;[I)C
boolean showMsg(View v, String msg); (Landroid/View;Ljava/lang/String;)Z
下面是方法的调用
第一个参数代表调用的这个方法所属于的对象,或者这个静态方法所属的类。
第二个参数代表jmethodID。
第三个参数以及后面的参数,代表这个方法的参数列表
<TYPE>是返回值的类型,比如返回值是void,则 CallVoidMethod
调用普通方法:
Call<Type>Method(jobject thiz, jmethodID methodID,...);
Call<Type>MethodV(jobject thiz, jmethodID methodID,va_listargs);
Call<Type>tMethodA(jobject thiz, jmethodID methodID,const jvalue *args);
调用静态方法:
CallStatic<Type>Method(jclass clazz, jmethodID methodID,...);
CallStatic<Type>MethodV(jclass clazz, jmethodID methodID,va_listargs);
CallStatic<Type>tMethodA(jclass clazz, jmethodID methodID,const jvalue *args);
// Java方法
public int show(int i,double d,char c){
…
}
// 本地调用Java方法
jint i=10L;
jdouble d=2.4;
jchar c=L'd';
(*env)->CallIntMethod(thiz , id_show , i, d, c);
jobject NewObjectV(jclass clazz, jmethodID methodID,va_list args);
jobject NewObjectA(jclass clazz, jmethodID methodID, const jvalue *args) ;
步骤: (1) jclass clazz=(*env)->FindClass("java/util/Date");
(2)jmethodID id_date=(*env)->GetMethodID(clazz,"Date","()V"); //取得某一个构造方法的jmethodID,后面的 ()V 根据实际的构造函数写。有参数的话,括号内就写上参数签名
(3)jobject date= (*env)->NewObject(clazz,id_date); //调用NewObject方法创建java.util.Date对象
- JNIEXPORT jstring JNICALL Java_Prompt_getLine(JNIEnv *env, jobject thiz, jstring string)
- {
- // 1. jstring ---> char *
- const char *str;
- str = (*env)->GetStringUTFChars(env, string,0); //把 string转换 const char* ,str 引用 它
- if (str == NULL) {
- return NULL; /* OutOfMemoryError already thrown */
- }
- printf("%s", str); //测试是否转换成功 // str可以拿去用了,用完就释放
- // const char * 转换 char *
- int len = strlen(str);
- char buf[len+1] ;
- strcpy(buf,str);
- printf("%s", buf); //测试是否转换成功
- (*env)->ReleaseStringUTFChars(env, string , str); // 释放引用,后面的两个参数: jstring ,const char *
- // 从C底层传出的 char * ,转换为 string
- // 2. char * ----> jstring
- return (*env)->NewStringUTF(buf);
- }
Java_IntArray_test(JNIEnv *env, jobject thiz, jintArray arr)
{
jint *carr;
carr = (*env)->GetIntArrayElements(env, arr, NULL); // carr 是一个指针,指向一个array的副本
if (carr == NULL) {
return 0; /* exception occurred */
}
for (i=0; i<len; i++) {
des[i]= carr[i];
}
(*env)->ReleaseIntArrayElements(env, arr, carr, 0);
(*env)->SetIntArrayRegion(env,array,0,len,test)
}
1. (*env)->GetIntArrayElements(env,jarray, isCopy) , 返回jarray中的所有数据的指针。
If isCopy is not NULL, then *isCopy is set to JNI_TRUE if a copy ismade; if no copy is made, it is set to JNI_FALSE.
2. (*env)->GetIntArrayRegion(env,array,start,len,buffer), 从start开始复制长度为len 的数据到buffer中
3. (*env)->SetIntArrayRegion(env,array,start,len,buffer) , 从start开始复制长度为len 的数据 从 buffer到 array 中
5. void (*SetObjectArrayElement)(JNIEnv*, jobjectArray, index, jobject); //设置某个索引上的值
Java_ObjectArrayTest_initInt2DArray(JNIEnv *env, jclass cls, int size) // 这是一个 静态方法,返回值是对象数组
{
jobjectArray result;
int i;
jclass intArrCls = (*env)->FindClass(env, "[I"); // int[] 类
if (intArrCls == NULL) {
return NULL; /* exception thrown */
}
result = (*env)->NewObjectArray(env, size, intArrCls, NULL); //生成数组类型的数组,大小为size,即二维数组
if (result == NULL) {
return NULL; /* out of memory error thrown */
}
for (i = 0; i < size; i++)
for(;i<ARRAY_LENGTH;i++) //一般数组的长度也是底层C带出来,或者传入的jarray根据jsize len =(*env)->GetArrayLength(env, jarray);
{
jstr = (*env)->NewStringUTF( env, sa[i] ); // 差别在这里,数组的元素不同,所以生成元素的函数不同而已。
(*env)->SetObjectArrayElement(env, texts, i, jstr);//必须放入jstring
(*env)->DeleteLocalRef(env, jstr); //4. 删除int数组的引用
}
{
JNIEnv *env = NULL;
if ((*jvm)->GetEnv(jvm, (void**)&env, JNI_VERSION_1_4))
}
// jclass cls = (*env)->FindClass(env, JNIT_CLASS);
// if (cls == NULL)
// return JNI_ERR;
// }
// jint nRes = (*env)->RegisterNatives(env, cls, gMethods, sizeof(gMethods)/sizeof(gMethods[0]));
// if (nRes < 0)
// {
// return JNI_ERR;
// }
}
1. #ifdef __cplusplus
在C中jclass代表类型void*,在C++中代表类型_jclass*。
- JNI 笔记 (总结一些基础的,常用的)
- android jni的一些总结
- 关于JNI的一些笔记
- [笔记]一些常用的
- MySQL的一些基础总结(一)
- CSS一些常用的总结
- 一些基础概念的总结。。。。
- 一些基础的面试总结
- Java基础的一些总结
- 常用总线的一些笔记
- iOS 一些常用的笔记
- git 常用的一些笔记
- Android中JNI 的一些常用说明 JNI_OnLoad registerNatives registerNativeMethods
- Android中JNI 的一些常用说明 JNI_OnLoad registerNatives registerNativeMethods
- Android中JNI 的一些常用说明 JNI_OnLoad registerNatives registerNativeMethods
- Android中JNI 的一些常用说明 JNI_OnLoad registerNatives registerNativeMethods
- Android中JNI 的一些常用说明 JNI_OnLoad registerNatives registerNativeMethods
- Android中JNI 的一些常用说明 JNI_OnLoad registerNatives registerNativeMethods
- LeetCode-Insert Interval
- BJOI2014 2014.8.13
- 01.策略模式 【STRATEGY PATTERN】
- Uva 6177
- HDU 2206 IP的计算
- JNI 笔记 (总结一些基础的,常用的)
- Leetcode--Sort List
- VB.net 控制Excel添加Sheet页,指定添加位置
- 【140814】VC++ 数据库编程教程 pdf 高清电子书
- 文件处理
- 更不接口
- makefile的语法及写法
- qt4嵌入式开发环境搭建过程(包括各种异常问题)(2)
- 关于C++程序键盘输入文件结束符