JNI入门程序

来源:互联网 发布:国家大数据行动计划 编辑:程序博客网 时间:2024/04/30 12:17

最近在写ndk需要用到叫你的知识

下面是写jni 的一般步骤,是一个简单的HelloWorld程序:

创建JNI的步骤:
1.写Java程序。其中的需要调用jni的接口,要声明为native
加入静态初始化模块,里面调用 System.loadLibrary("test");

</pre><pre name="code" class="java">class Helloworld {        static {                System.loadLibrary("helloworld");        }        public native void print(String str);        public static void main(String[] args){                new Helloworld().print("hello world");        }}


2.用javac编译,生成class文件
javac HelloWorld.java


3.用javah带-jni参数编译 class文件生成 h文件。
javah -jni Helloworld

这里会生成HelloWorld.h


javah的常用编译参数:

  -classpath bin:表示类的路劲,即class文件所在的路径

  -d jni: 表示生成的头文件存放的目录

例如:

javah -classpath bin -d jni com.example.hellojni.HelloJni



4.创建c,实现h文件。并编译成so文件。需要链接jni.h文件

#include<stdio.h>#include "Helloworld.h"JNIEXPORT void JNICALL Java_Helloworld_print  (JNIEnv *env, jobject obj, jstring str){        const char *p = env->GetStringUTFChars(str, NULL);        printf("%s\n", p);}

编译生成libhelloworld.so:

g++ -I/home/server-31/jdk1.6.0_31/include/ -I/home/server-31/jdk1.6.0_31/include/linux -fPIC -shared -o libhelloworld.so helloworld.c
其中:/home/server-31/jdk1.6.0_31/ 是jdk的安装目录,如果不太清楚 echo $PATH看一下


5.执行java 程序

java -Djava.library.path='.' HelloWorld

也可以把libhelloworld.so拷贝到 java.library.path 目录下,具体在哪,可通过

System.out.println(System.getProperty("java.library.path"))查看

------------------------------------------------------------------------------------------------------------------------------------------------------

JNI常用的处理函数
(1)   const char* GetStringUTFChars (jstring string,jboolean* isCopy)
返回指向字符串UTF编码的指针,如果不能创建这个字符数组,返回null。这个指针在调用ReleaseStringUTFChar()函数之前一直有效。 参数:
string Java字符串对象 
isCopy 如果进行拷贝,指向以JNI_TRUE填充的jboolean,否则指向以JNI_FALSE填充的jboolean。


(2)   void ReleaseStringUTFChars(jstring str, const char* chars)
通知虚拟机本地代码不再需要通过chars访问Java字符串。
参数:
string Java字符串对象 
chars 由GetStringChars返回的指针

 (3) 对于上述类型数组,有一组函数与之对应,以下函数中Xxx为对应类型。
xxx* GetXxxArrayElements(xxxArray array, jboolean *isCopy)
产生一个指向Java数组元素的C指针。不再需要时,需将此指针传给ReleaseXxxArrayElements
参数:
array 数组对象 
isCopy 如果进行拷贝,指向以JNI_TRUE填充的jboolean,否则指向以JNI_FALSE填充的jboolean。 
例如:jboolean * GetBooleanArrayElements(jbooleanArray array, jboolean *isCopy)

(4)   void ReleaseXxxArrayElements(xxxArray array,xxx *elems, jint mode)
通知虚拟机不再需要从GetXxxArrayElements得到的指针。 
参数:
array 数组对象 
elems 不再需要的指向数组元素的指针 
mode 0=在更新数组元素后释放elems缓冲器 
JNI_COMMIT=在更新数组元素后不释放elems缓冲器 
JNI_ABORT=不更新数组元素释放elems缓冲器 
例如:void ReleaseBooleanArrayElements(jbooleanArray array,jboolean *elems, jint mode)

java和c/c++元素对应关系




0 0
原创粉丝点击