`
daiming253685
  • 浏览: 23545 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

JNI学习记录

    博客分类:
  • J2EE
 
阅读更多

需要声明一下:本人是通过ITCast www.itcast.cn 的视频学习的。

1.     JNIJava与本地C/C++代码相互操作的一种方案。

2.     要使用JNI,需要:

1),在Java源程序中使用native关键字声明一个方法。

         如: public native void callCppFunction();

2),然后在命令行提示符下使用javah这个命令来生成关于JNI的本地头文件。

如: javah test.jni.MainArrayTest

         3),在VC Studio中建立一个DLL工程,拷贝这个头文件到该工程目录下,拷贝

         %JAVA_HOME%\include下面的jni.hjni_md.h到工程目录下,或者加到系统目下,具体需要拷贝的头文件还要具体研究。

4),建一个cpp源文件,实现生成的头文件中声明的函数。

5),具体各种函数及数据类型的使用如下:具体自己研究:

 

l       简单方法调用,基本数据类型的使用

jclass clazz_TestNative = env->GetObjectClass(obj);

/*      

jfieldID id_number = env->GetFieldID(clazz_TestNative,

           "number", "I");

jint number = env->GetIntField(obj, id_number);

 

cout<<number<<endl;

 

env->SetIntField(obj, id_number, 1000L);

*/

 

//        jmethodID id_max = env->GetMethodID(clazz_TestNative, "max", "(DD)D");

//        jdouble maxValue = env->CallDoubleMethod(obj, id_max, 3.14, 3.15);

 

//        cout<<maxValue<<endl;

 

 

jfieldID id_person = env->GetFieldID(clazz_TestNative, "person", "Ltest/jni/Father;");

jobject person = env->GetObjectField(obj, id_person);

 

jclass clazz_Father = env->FindClass("test/jni/Father");

jmethodID id_Father_Function = env->GetMethodID(clazz_Father, "function", "()V");

env->CallVoidMethod(person, id_Father_Function);

env->CallNonvirtualObjectMethod(person,clazz_Father, id_Father_Function);

 

 

l       对象的使用

jclass clazz_date = env->FindClass("java/util/Date");

jmethodID outputDate_ID = env->GetMethodID(clazz_date, "<init>", "()V");

jobject date_obj = env->NewObject(clazz_date, outputDate_ID);

jmethodID mid_date_getTime = env->GetMethodID(clazz_date, "getTime", "()J");

 

unsigned times = env->CallLongMethod(date_obj, mid_date_getTime);

//        printf("%u",times);

cout<<times<<endl;

l       字符串的简单实用

jfieldID fid_msg = env->GetFieldID(env->GetObjectClass(obj), "message", "Ljava/lang/String;");

jstring j_msg = (jstring)env->GetObjectField(obj, fid_msg);

//const jchar *p_jst = env->GetStringChars(j_msg, NULL);

//MessageBoxW(NULL,(const wchar_t *)p_jst, L"Title", MB_OK);

jint len = env->GetStringLength(j_msg);

jchar *j_buf = new jchar[len+1];

j_buf[len] = L'\0';

env->GetStringRegion(j_msg, 0, len, j_buf);      

wstring wstr((const wchar_t *)j_buf);

//env->ReleaseStringChars(j_msg, j_buf);//不能释放字符数组啊

delete []j_buf;

 

std::reverse(wstr.begin(), wstr.end());

jstring jnewStr = env->NewString((const jchar*)wstr.c_str(), wstr.size());

env->SetObjectField(obj, fid_msg, jnewStr);

                  

l       数组的使用

jfieldID fid_arrays = env->GetFieldID(env->GetObjectClass(obj), "arrays", "[I");

jintArray jint_arr = (jintArray)env->GetObjectField(obj, fid_arrays);

 

jint *int_arr = env->GetIntArrayElements(jint_arr, NULL);

jsize len = env->GetArrayLength(jint_arr);

 

for(int i = 0; i < len; ++i)

{

//       cout<<int_arr[i]<<endl;

}

sort(int_arr, int_arr + len, less_second);

env->ReleaseIntArrayElements(jint_arr, int_arr, /*JNI_ABORT/JNI_COMMIT/0*/0);

}

 

bool less_second(const int & m1, const int & m2)

{

        return m1 > m2;

}

 

上面要注意在JNI中对Java中数据类型的映射,见头文件的声明。

还有注意Java中关于对象类型的表示方法比如:int I, boolean Z,

Object L<类的完整名称,注意包名以/分隔>;,数组[<数据类型>

如果不知道可以使用javap这个反编译器。

        

         6)、更多资料,将Java手册。

         7)、编译,生成DLL。将DLL的文件路径加到Path环境变量下:

         8)、在Main函数中加载动态库。

如:System.loadLibrary("TestNative4"),注意不要DLL扩展名,为了跨平台嘛!

9)、如果使用的是eclipse之类的IDE工具,请重启,因为该类工具在启动时,默认读取了系统变量,但是不会监视变量的变化。

10)、注意在JNI中对Java对象的引用。不然垃圾回收将会产生问题。注意全局引用,局部引用、弱全局引用的使用。

           局部引用,也就是本地方法中返回引用。应该使用DeleteLocalRef释放该引用。NewLocalRef创建。还用很多方式创建。

           全局引用,需要手动释放,防止垃圾回收器回收。需要使用NewGlobalRef函数创建,释放它需要使用DeleteGlobalRef函数。

           弱全局引用,需要编程人员手动释放,但是它不防止垃圾回收器的回收。

           使用NewWeakGlobalRef创建,使用DeleteWeakGlobalref释放。IsSamObject(jobject obj1, jobject obj2)判断弱全局引用指向的对象是否已被回收。

分享到:
评论

相关推荐

    JNI学习笔记.doc

    ### JNI学习笔记详解 #### 一、JNI简介 JNI(Java Native Interface)是Java平台提供的一种强大机制,它允许Java程序直接调用本地代码(通常是C或C++编写)。这为Java应用程序带来了额外的灵活性,使得开发者能够...

    java与c++交互(JNI学习笔记)

    ### Java与C++交互(JNI学习笔记) #### 一、Java类型与C/C++类型对应关系 在Java Native Interface (JNI) 中,Java 和 C/C++ 的数据类型有着明确的对应关系。理解这些对应关系是实现Java与C++交互的基础。 - **...

    android JNI 学习笔记.doc

    ### Android JNI 学习笔记详解 #### 一、JNI简介 JNI(Java Native Interface)即Java本地接口,是Java平台标准的一部分,它允许Java代码和其他语言(如C、C++等)编写的本地代码进行交互。在Android开发中,通过...

    黑马程序员JNI学习笔记

    针对所有初学JNI的人员的一个最全面的笔记,对于有过基础的朋友来说又是一个更好的助手. 省去了你自己去总结的时间,有更多的时间去敲代码. ------------黑马程序员学员-------------------

    Android JNI 学习笔记

    做为Android JNI还未入门的同志们,我这个总结的文档对你们真的很有用处,几乎大部分常规的Java访问C/C++以及C/C++访问Java的内容都包含在内。

    jni学习源码

    在“jni学习源码”这个资料中,包含了两个关键部分:`jni学习笔记.docx`和`myNDK`。`jni学习笔记.docx`很可能是对JNI基础知识的详细讲解,包括但不限于以下内容: 1. **JNI基本概念**:解释JNI的作用,为何要在Java...

    android_JNI学习(记录文档+参考代码)

    本资源包含了Android JNI的学习文档和参考代码,帮助开发者理解和实践JNI的开发过程。 1. **环境搭建**: 在开始Android JNI开发前,首先需要搭建好开发环境。这包括安装Android Studio,配置NDK(Native ...

    Android学习笔记含JNI、USB和ftdi通信方式详解

    ### Android学习笔记含JNI、USB和ftdi通信方式详解 #### 项目四:多线程文件下载 在Android开发中,文件下载是一个常见的需求。利用多线程技术可以提高文件下载的速度,尤其在网络条件较差的情况下更为明显。多...

    一个简单的Jni工程包括个人学习笔记

    这个压缩包“一个简单的Jni工程包括个人学习笔记”显然是一份关于JNI开发的学习资料,对于想要深入理解或初次接触JNI的开发者来说非常有价值。 JNI的核心在于提供了一种方式,使得Java代码能够调用本地(native)...

    jni层内存泄漏检测工具

    1. **对象追踪**:LeakTracer会监控JNI层创建的Java对象,记录它们的生命周期,包括创建、使用和释放过程。 2. **引用分析**:它检查JNI函数中是否存在对Java对象的长期引用,这些引用可能导致对象无法被垃圾回收。...

    JNI CHM 文档查询 编程规范

    "biji.txt"可能是笔记、日志或其他辅助资料,它可能包含了一些开发者在学习和使用JNI过程中记录的信息。 总的来说,这个压缩包提供了一个全面的学习资源,涵盖了JNI的基础知识、调用流程、编程规范和实例,适合...

    jni4net分享

    1. **changes.txt**: 这个文件通常记录了项目的版本更新历史,包括每个版本的新功能、修复的bug以及性能改进等。通过阅读这个文件,你可以了解jni4net的发展历程和当前版本的主要改进。 2. **ReadMe.txt**: 这是...

    hello jni的源代码

    总之,这个"Hello JNI"源代码项目是一个很好的学习资源,可以帮助开发者深入理解Android应用中JNI的工作原理和实践技巧。通过这个项目,不仅可以学习到JNI的基础知识,还能进一步提升Android应用开发的综合能力。

    Android 5.0jni调用

    7. **错误处理**:Android 5.0提供了更好的错误报告机制,帮助开发者诊断JNI相关的错误,例如通过`Log`记录错误信息。 8. **JNI注册表**:在早期版本中,JNI函数需要通过注册表手动注册。在Android 5.0中,可以使用...

    JNI测试用例代码及报告

    总之,"JNI测试用例代码及报告"是一个很好的学习资源,它涵盖了JNI的基础知识、实战应用和问题解决,对于想深入了解和使用JNI的人来说,是一份宝贵的资料。通过分析和实践这些测试用例,开发者可以更好地掌握JNI的...

Global site tag (gtag.js) - Google Analytics