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++元素对应关系
- JNI入门程序
- JNI入门 一个JNI的HelloWorld 程序
- JNI入门 一个JNI的HelloWorld 程序
- ndk编译c可执行程序(jni 入门)
- ndk编译c可执行程序(jni 入门)
- ndk编译c可执行程序(jni 入门)
- 编写第一个jni入门程序
- 编写第一个jni入门程序
- JNI入门
- JNI入门
- JNI入门
- JNI入门
- JNI 入门
- JNI入门
- JNI入门
- JNI入门
- JNI入门
- jni入门
- Java正则表达式
- 阅读者之JAVA小记---关于编程学习的一些经验
- 什么是object?
- Java工具类
- STM32F05x移植GD32F1x0注意事项
- JNI入门程序
- 【最讨厌那些不开源的】小米的米UI的BOTTOMVIEW源码完美反编译
- 邓白氏编码 苹果证书申请完的感受
- 克隆JS对象的三个实用方法
- Unix/Linux环境C编程入门教程(11) 开发环境搭建VMWare虚拟安装之虚拟化检测
- Visual Studio代码字体
- 2010-11-01 22:04 Codewarrior for HCS12的中断服务程序编写说明
- 在 R 中安装 XML包 报错 cannot find xml2-config
- 问题小结:tomcat-严重: Error initializing endpoint