JNI学习1
2013-04-10 15:20
134 查看
实践出真知,首先是从Hello JNI开始接触
目标文件包括:Hello.c Hello.class Hello.h Hello.java libHello.so;实现功能为在标准输出上打印Hello JNI
操作流程是:
编写Hello.java
用javac Hello.java 生成 Hello.class
用javah -jni Hello生成Hello.h
然后编写Hello.c,使用Gcc编译共享库libHello.so
最后调用java运行
共享库的编译命令为:gcc -shared -fPIC -I /usr/local/jdk1.6.0_30/include/ -I /usr/local/jdk1.6.0_30/include/linux/ -I /usr/local/ Hello.c -o libHello.so
运行命令为:java -Djava.library.path=. Hello
以下是主要文件代码
Hello.java
View Code
最后运行修改后的Hello命令:java -Djava.library.path=. basic.Hello
运行结果:xxx Hello JNI
5、JNI中获取方法和变量域
大概需要如下三个步骤:
获取对象的类,例如
获取类中函数/变量域的ID(GetMethodID,GetFieldID),例如
调用JNI中方法对函数/变量进行访问,例如
Reference
Java基础知识——JNI入门介绍(下)
JNI使用规范详解
目标文件包括:Hello.c Hello.class Hello.h Hello.java libHello.so;实现功能为在标准输出上打印Hello JNI
操作流程是:
编写Hello.java
用javac Hello.java 生成 Hello.class
用javah -jni Hello生成Hello.h
然后编写Hello.c,使用Gcc编译共享库libHello.so
最后调用java运行
共享库的编译命令为:gcc -shared -fPIC -I /usr/local/jdk1.6.0_30/include/ -I /usr/local/jdk1.6.0_30/include/linux/ -I /usr/local/ Hello.c -o libHello.so
运行命令为:java -Djava.library.path=. Hello
以下是主要文件代码
Hello.java
View Code
#include<stdio.h> #include"Hello.h" JNIEXPORT void JNICALL Java_basic_Hello_println (JNIEnv *env, jobject obj, jstring str) { // get the object's class handle jclass clsstr=(*env)->FindClass(env,"java/lang/String"); // create a string object in UTF-8 format jstring strencode=(*env)->NewStringUTF(env,"utf-8"); // get the object's method handle, JNIenv, Object class, method name, method signature // One can get the method signature by running "javap -s <class name>" jmethodID mid=(*env)->GetMethodID(env,clsstr,"toCharArray","()[C"); // invoke the object method, JNIenv, java object, method ID, parameters jcharArray barr=(jcharArray)(*env)->CallObjectMethod(env,str,mid,strencode); jsize alen=(*env)->GetArrayLength(env,barr); jboolean tt=JNI_TRUE;// or JNI_FALSE jboolean *t=&tt; // get a point to the header of a char array, JNIenv, the array, is copy jchar* ba=(*env)->GetCharArrayElements(env,barr,t); while(*ba!='\0') printf("%c",*(ba++)); ba-=alen; // release the reference of the array (*env)->ReleaseCharArrayElements(env,barr,ba,0); printf(" Hello JNI\n"); return; }
最后运行修改后的Hello命令:java -Djava.library.path=. basic.Hello
运行结果:xxx Hello JNI
5、JNI中获取方法和变量域
大概需要如下三个步骤:
获取对象的类,例如
jclass clsstr=(*env)->FindClass(env,"java/lang/String"); jclass cls=(*env)->GetObjectClass(env,myobj); 等等
获取类中函数/变量域的ID(GetMethodID,GetFieldID),例如
/* * 使用 javap -classpath <jar path> -s <class qualified name> 获取函数签名 */ jmethodID mid=(*env)->GetMethodID(env,clsstr,"toCharArray","()[C"); /* * JNI定义中有变量域的官方定义标签,JNI Data Structures */ jfieldID fid_msg=(*env)->GetFieldID(env,cls,"val","Z");
调用JNI中方法对函数/变量进行访问,例如
//变量访问 printf("%d\n",(*env)->GetBooleanField(env,myobj,fid_msg)); //方法调用 jcharArray barr=(jcharArray)(*env)->CallObjectMethod(env,str,mid,strencode);
Reference
Java基础知识——JNI入门介绍(下)
JNI使用规范详解
相关文章推荐
- 安卓逆向学习笔记(5) - 在JNI_Onload 函数处下断点避开针对IDA Pro的反调试
- NDK/JNI学习--导入hello-jni工程
- (二)JNI学习之C语言基础,控制语句
- 【学习Android NDK开发】native code通过JNI调用Java方法
- Android学习之 JNI
- JNI学习------C语言调用Java
- Jni学习一:了解Jni
- android JNI 学习笔记
- 学习android JNI的那些事儿--------2. HelloWorld
- Android JNI学习笔记(五)-这两篇,足够了解jni
- 学习——>JNI设置C++与java的结合
- JNI学习积累之二 ---- 数据类型映射、域描述符说明
- Android JNI 学习(一):JNI 简介
- 8月21,安卓开发JNI学习笔记整理
- 技术转载:Jni学习二:JNI 数据类型
- JNI学习积累之三 ---- 操作JNI函数以及复杂对象传递
- JNI学习积累之一 ---- 常用函数大全
- Java JNI学习(二)
- JNI学习之步步深入一
- Java JNI学习(四)