JNI教程(五)
来源:互联网 发布:明星的淘宝店铺名字 编辑:程序博客网 时间:2024/06/03 02:26
JNI操作字符串简单的例子
一、编写StringObjectJava.java文件
class StringValue { private String m_value; private int m_byteLen; StringValue() { m_value = "empty"; m_byteLen = m_value.getBytes().length; } public String getValue() { return m_value; } public void setValue(String value) { m_value = value; m_byteLen = value.getBytes().length; } int getByteLength() { return m_byteLen; }}public class StringObjectJava{ //所有native关键词修饰的都是对本地的声明 public native void setStringJni(StringValue obj); static { System.loadLibrary("test");//载入本地库 } public static void main(String[] args) { StringValue string_value_obj = new StringValue(); StringObjectJava obj = new StringObjectJava(); System.out.println("setStringJni before str = " + string_value_obj.getValue() + "\t bytelen = " + string_value_obj.getByteLength()); obj.setStringJni(string_value_obj); System.out.println("setStringJni after str = " + string_value_obj.getValue() + "\t bytelen = " + string_value_obj.getByteLength()); }}
二、执行javac命令
javac StringObjectJava.java
三、执行javah命令创建JNI头文件
(1) javah StringObjectJava
(2) mv StringObjectJava.h StringObjectJni.h
四、创建JNI实现文件
vi StringObjectJni.cpp
#include "StringObjectJni.h"#include "iostream"/* class: StringObjectJava * Method: setStringJni * Signature: (LStringValue;)V */JNIEXPORT void JNICALL Java_StringObjectJava_setStringJni (JNIEnv *env, jobject static_instance, jobject string_value_obj) { std::cout << "hello Java_StringObjectJava_setStringJni implements C++"<< std::endl; jclass cls = env->GetObjectClass(string_value_obj); jmethodID function_id = env->GetMethodID(cls , "getValue" , "()Ljava/lang/String;"); jstring input_js = (jstring)env->CallObjectMethod(string_value_obj, function_id); function_id = env->GetMethodID(cls , "getByteLength" , "()I"); jint input_len = env->CallIntMethod(string_value_obj,function_id); const char* input_ptr = env->GetStringUTFChars(input_js,NULL); std::cout << "java string_value_obj data :" << std::string(input_ptr,input_len)<<std::endl; // Return value std::string ret_val("hello world jni"); jstring ret_js_val = env->NewStringUTF(ret_val.c_str()); function_id = env->GetMethodID(cls , "setValue" , "(Ljava/lang/String;)V"); env->CallVoidMethod(string_value_obj, function_id,ret_js_val); // 调用GetStringUTFChars函数必须释放资源,否则会内存泄漏。 env->ReleaseStringUTFChars(input_js,input_ptr); // 调用NewStringUTF函数必须释放资源,否则内存泄漏。 env->DeleteLocalRef(ret_js_val);}
五、编译动态链接库
(1) g++ -fPIC -I/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include/ -I/usr/lib/jvm/java-1.6.0-openjdk-1.6.0.0.x86_64/include/Linux -c StringObjectJni.cpp
(2) g++ -shared -o libtest.so StringObjectJni.o
六、执行java类
java -Djava.library.path=. StringObjectJava
0 0
- JNI教程(五)
- JNI教程(一)
- JNI教程(二)
- JNI教程(三)
- JNI教程(四)
- jni教程(AndroidStudio)
- Java JNI学习(五)
- JNI教程
- Draw2D 教程(五)
- Draw2D 教程(五)
- Angular2教程(五)
- Octave教程(五)
- android 之 JNI 详解(五)
- Android自助餐之Jni(五)进阶
- Jni基础开发入门(五)
- JNI/NDK开发指南(五)
- NDK-JNI实战教程(二) JNI官方中文资料
- NDK-JNI实战教程(二) JNI官方中文资料
- 微信小程序组件1--视图容器
- eclipse svn报Previous operation has not finished; run 'cleanup' if it was interrupted
- Image I/O编程指南
- 每天一个 Linux 命令(17):whereis 命令
- Ubuntu 15.10 新增硬盘详细过程
- JNI教程(五)
- 里面有大量的视频学习资料,包括微信,laravel,yii,python等等
- centos 7 取消LOG输出限制
- 常用的js处理方法(数字每隔三位加逗号分开,日期)
- 使用CNN神经网络进行图片识别分类
- googLeNet--Inception四部曲四Inception-ResNet and the Impact of Residual Connections on Learning
- CoreAnimation --- 组动画
- WS,窗口样式
- linux重启tomcat常用命令