----------------------但是要想在 eclipse 中运行 helloJni.dll 文件,就需要将文件拷贝到工程的根目录,或者将其放在诸如 C:WINDOWSsystem32C:WINDOWS等目录下。
因为,eclipse 在运行 helloJni.dll 文件时首先会去在当前根目录找,如果找不到则在 path 上去找,因此你还可以为了方便管理生成的 dll 文件,将所有工程中的dll 文件都放到一个特定的目录,然后将该目录加入到你的本地 path 环境变量中去,这样每次只需要将生成的 dll 文件放入 path 目录下就可以访问了。
注,如果需要加环境变量最好在加好以后重新启动一下 eclipse,确保 eclipse 能够加载到最新的 path 环境。
接下来,对小例子进行重构:1. 新增一个基础类Java 代码 1. package org.danlley.jni.test 2. 3. public class BaseClass 4. 5. public BaseClassString arg 6. loadLibraryarg 7. 8. 9. private static void loadLibraryString arg 10. System.loadLibraryarg 11. 12. 2. 定义新类继承基础类Java 代码 1. package org.danlley.jni.test 2. 3. public class HelloJniTest extends BaseClass 4. public HelloJniTestString arg 5. superarg 6. 7. public native void displayHelloJni 8. 3. 编写调用类Java 代码 1. package org.danlley.jni.test 2. 3. public class RunMain 4. public static void mainString args 5. new HelloJniTestquothelloJniTestquot.displayHelloJni 6. 7. 此次,将 dll 文件定义为:helloJniTest.dll。
执行结果:------------------------------------------------------------------Java_org_danlley_jni_test_HelloJniTest_displayHelloJni has been called-------------------------------------------------------------------例子相当简单,没有传入参数,也没有返回值,那么是不是可以让本地方法返回一些参数,同时又可以传入数据进行处理,并把处理结果返回给方法的调用者呢,先拿基本类型开刀。
接下来对 HelloJniTest 继续进行改造:新增两个本地方法,如下:Java 代码 1. package org.danlley.jni.test 2. 3. public class HelloJniTest extends BaseClass 4. public HelloJniTestString arg 5. superarg 6. 7. public native void displayHelloJni 8. 9. public native int getDynamicIntDataNoParam 10. 11. public native int getDynamicIntDataint i 12. 重新生成 org_danlley_jni_test_HelloJniTest.h 文件,并改写其实 org_danlley_jni_test_HelloJniTest.cpp 如下:Cpp 代码 1. // org_danlley_jni_test_HelloJniTest.cpp: implementation of th e org_danlley_jni_test_HelloJniTest class. 2. // 3. //////////////////////////////////////////////////////////// 4. 5. include quotorg_danlley_jni_test_HelloJniTest.hquot 6. include ltjni.hgt 7. include ltstdio.hgt 8. 9. JNIEXPORT void JNICALL 10. Java_org_danlley_jni_test_HelloJniTest_displayHelloJniJNIEnv env jobject obj 11. 12. printfquotJava_org_danlley_jni_test_HelloJniTest_displayHel loJni has been callednquot 13. return 14. 15. 16. JNIEXPORT jint JNICALL 17. Java_org_danlley_jni_test_HelloJniTest_getDynamicIntDataNoPar amJNIEnv env jobject obj 18. 19. return 65535 20. 21. 22. JNIEXPORT jint JNICALL 23. Java_org_danlley_jni_test_HelloJniTest_getDynamicIntDataJNIE nv env jobject obj jint i 24. 25. ii 26. return i 27. 修改 RunMain 类:Java 代码 1. package org.danlley.jni.test 2. 3. public class RunMain 4. public static void mainString args 5. HelloJniTest testernew HelloJniTestquothelloJniTestquot 6. tester.displayHelloJni 7. int itester.getDynamicIntDataNoParam 8. System.out.printlnquottester.getDynamicIntDataNoParam quoti 9. int jtester.getDynamicIntData100 10. System.out.printlnquottester.getDynamicIntData100quotj 11. 12. 运行 RunMain:-------------------------------------------------------------------tester.getDynamicIntDataNoParam65535tester.getDynamicIntData10010000Java_org_danlley_jni_test_HelloJniTest_displayHelloJni has been called-------------------------------------------------------------------OK,一切正常。
还是不过瘾,简单对象可以处理了,如果是一个 java 对象,还可以处理吗,答案是当然可以,接下来我们来继续对 helloJniTest 类进行改造。
新增一个方法如下:Java 代码 1. package org.danlley.jni.test 2. 3. public class HelloJniTest extends BaseClass 4. public HelloJniTestString arg 5. superarg 6. 7. public native void displayHelloJni 8. 9. public native int getDynamicIntDataNoParam 10. 11. public native int getDynamicIntDataint i 12. 13. public native String getDynamicStringDataString arg 14. 重新生成 org_danlley_jni_test_HelloJniTest.h 文件:Cpp 代码 1. / DO NOT EDIT THIS FILE - it is machine generated / 2. include ltjni.hgt 3. / Header for class org_danlley_jni_test_HelloJniTest / 4. 5. ifndef _Included_org_danlley_jni_test_HelloJniTest 6. define _Included_org_danlley_jni_test_HelloJniTest 7. ifdef __cplusplus 8. extern quotCquot 9. endif 10./ 11. Class: org_danlley_jni_test_HelloJniTest12. Method: displayHelloJni13. Signature: V14. /15.JNIEXPORT void JNICALL Java_org_danlley_jni_test_HelloJniTest_d isplayHelloJni16. JNIEnv jobject17.18./19. Class: org_danlley_jni_test_HelloJniTest20. Method: getDynamicIntDataNoParam21. Signature: I22. /23.JNIEXPORT jint JNICALL Java_org_danlley_jni_test_HelloJniTest_g etDynamicIntDataNoParam24. JNIEnv jobject25.26./27. Class: org_danlley_jni_test_HelloJniTest28. Method: getDynamicIntData29. Signature: II30. /31.JNIEXPORT jint JNICALL Java_org_danlley_jni_test_HelloJniTest_g etDynamicIntData32. JNIEnv jobject jint33.34./35. Class: org_danlley_jni_test_HelloJniTest36. Method: getDynamicStringData37. Signature: Ljava/lang/StringLjava/lang/String 38. / 39.JNIEXPORT jstring JNICALL Java_org_danlley_jni_test_HelloJniTes t_getDynamicStringData 40. JNIEnv jobject jstring 41. 42.ifdef __cplusplus 43. 44.endif 45.endif改写 org_danlley_jni_test_HelloJniTest.cpp 文件:Cpp 代码 1. // org_danlley_jni_test_HelloJniTest.cpp: implementation of the org_danlley_jni_test_HelloJniTest class. 2. // 3. /////////////////////////////////////////////////////////// 4. 5. include quotorg_danlley_jni_test_HelloJniTest.hquot 6. include ltjni.hgt 7. include ltstdio.hgt 8. 9. JNIEXPORT void JNICALL 10.Java_org_danlley_jni_test_HelloJniTest_displayHelloJniJNIEnv env jobject obj 11. 12. printfquotJava_org_danlley_jni_test_HelloJniTest_displayHello Jni has been callednquo
上一篇:
【精品】C++程序书写规范
下一篇:
餐饮管理系统