• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            淺析如何將jni類(lèi)打包package到指定的包路徑中

            淺析ubuntu 8.10下使用jdk6進(jìn)行jni開(kāi)發(fā)測(cè)試

            luther@gliethttp:~/jni$ vim jusbhid.java
            package gliethttp.usb.usbhid; // 使用打包命令package,將jusbhid類(lèi)打包到gliethttp.usb.usbhid中.
            public class jusbhid
            {
            public native String usbhid_open(int vid, int pid);
            public native String usbhid_sendstring(String id, String command);
            static {
            System.loadLibrary("usbhid");
            }
            }
            luther@gliethttp:~/jni$ javac jusbhid.java -d . // 將會(huì)在當(dāng)前目錄生成包路徑gliethttp/usb/usbhid文件夾,如果
            luther@gliethttp:~/jni$ tree gliethttp/ // 沒(méi)有定義-d .那么將直接在當(dāng)前目錄生成jusbhid.class
            gliethttp/
            `-- usb
            `-- usbhid
            `-- jusbhid.class

            2 directories, 1 file
            luther@gliethttp:~/jni$
            luther@gliethttp:~/jni$ javah gliethttp.usb.usbhid.jusbhid // 生成jni頭文件.h
            luther@gliethttp:~/jni$ ll gliethttp_usb_usbhid_jusbhid.h // 頭文件名為gliethttp_usb_usbhid_jusbhid.h
            -rw-r--r-- 1 luther luther 788 2009-07-31 12:38 gliethttp_usb_usbhid_jusbhid.h
            luther@gliethttp:~/jni$ vim gliethttp_usb_usbhid_jusbhid.h // 可以看到有如下內(nèi)容,這里來(lái)看,加入package gliethttp.usb.usbhid;
            /* DO NOT EDIT THIS FILE - it is machine generated */ // 與直接定義public class gliethttp_usb_usbhid_jusbhid效果一樣
            #include <jni.h> // 類(lèi)名中符號(hào)'_'表示包路徑.
            /* Header for class gliethttp_usb_usbhid_jusbhid */

            #ifndef _Included_gliethttp_usb_usbhid_jusbhid
            #define _Included_gliethttp_usb_usbhid_jusbhid
            #ifdef __cplusplus
            extern "C" {
            #endif
            /*
            * Class: gliethttp_usb_usbhid_jusbhid
            * Method: usbhid_open
            * Signature: (II)Ljava/lang/String;
            */
            JNIEXPORT jstring JNICALL Java_gliethttp_usb_usbhid_jusbhid_usbhid_1open
            (JNIEnv *, jobject, jint, jint);

            /*
            * Class: gliethttp_usb_usbhid_jusbhid
            * Method: usbhid_sendstring
            * Signature: (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;
            */
            JNIEXPORT jstring JNICALL Java_gliethttp_usb_usbhid_jusbhid_usbhid_1sendstring
            (JNIEnv *, jobject, jstring, jstring);

            #ifdef __cplusplus
            }
            #endif
            #endif
            luther@gliethttp:~/jni$ vim jusbhid.c
            // [luther.gliethttp] -- 20090731
            #include <stdio.h>
            #include "gliethttp_usb_usbhid_jusbhid.h"

            JNIEXPORT jstring JNICALL Java_gliethttp_usb_usbhid_jusbhid_usbhid_1open(JNIEnv *env, jclass obj, jint vid, jint pid)
            {
            char buf[512];
            printf("vid=0x%04x pid=0x%04x\n", vid, pid);
            sprintf(buf, "0#1#2#3#4#5\n");
            return (*env)->NewStringUTF(env, buf);
            }

            JNIEXPORT jstring JNICALL Java_gliethttp_usb_usbhid_jusbhid_usbhid_1sendstring(JNIEnv *env, jclass obj, jstring id, jstring command)
            {
            int fd;
            const char *idv;
            const char *commands;
            idv = ((*env)->GetStringUTFChars)(env, id, 0);
            commands = ((*env)->GetStringUTFChars)(env, command, 0);
            fd = atoi(idv);
            printf("[%d] %s\n", fd, commands);
            return (*env)->NewStringUTF(env, "usbhid_sendstring ok!\n");
            }
            luther@gliethttp:~/jni$ gcc -fPIC -I /usr/local/jdk1.6.0_14/include -I /usr/local/jdk1.6.0_14/include/linux -shared -o libusbhid.so jusbhid.c
            luther@gliethttp:~/jni$ export CLASSPATH=.:$CLASSPATH // 如果沒(méi)有正常配置jdk的話,需要強(qiáng)硬指定搜索路徑
            luther@gliethttp:~/jni$ sudo vim /etc/profile // 或者追加如下內(nèi)容,配置jdk環(huán)境
            JAVA_HOME=/usr/local/jdk1.6.0_14
            JRE_HOME=/usr/local/jdk1.6.0_14/jre
            CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib
            export JAVA_HOME JRE_HOME CLASSPATH

            luther@gliethttp:~$ source /etc/profile
            luther@gliethttp:~/jni$ vim usbhid_jni_example.java
            import gliethttp.usb.usbhid.*; // 導(dǎo)入CLASSPATH搜索路徑中,路徑為gliethttp/usb/usbhid/下的所有.class包
            public class usbhid_jni_example
            {
            public static void main(String[] args)
            {
            String rets;
            jusbhid hid = new jusbhid();
            rets = hid.usbhid_open(0x1234,0x5678);
            System.out.printf("%s", rets);
            rets = hid.usbhid_sendstring("88", "QWS\r");
            System.out.printf("%s", rets);
            }
            }
            luther@gliethttp:~/jni$ javac usbhid_jni_example.java
            usbhid_jni_example.java:7: cannot access jusbhid
            bad class file: ./jusbhid.java
            file does not contain class jusbhid
            Please remove or make sure it appears in the correct subdirectory of the classpath.
            jusbhid hid = new jusbhid();
            ^
            1 error
            luther@gliethttp:~/jni$ mv jusbhid.java jusbhid.java.raw // 必須去掉當(dāng)前目錄jusbhid.java,否則javac將提示上面的錯(cuò)誤
            luther@gliethttp:~/jni$ javac usbhid_jni_example.java
            luther@gliethttp:~/jni$ export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
            luther@gliethttp:~/jni$ java usbhid_jni_example
            vid=0x1234 pid=0x5678
            0#1#2#3#4#5
            [88] QWS
            usbhid_sendstring ok!

            好了我們的jni類(lèi)package打包分發(fā)工作初步探索已經(jīng)告一段落了,因?yàn)橛辛藀ackage概念,
            所以代碼管理就更加容易,可以將一類(lèi)的代碼全部放入一個(gè)package包中.[luther.gliethttp]
            在VS2005下用C++寫(xiě)的程序,在一臺(tái)未安裝VS2005的系統(tǒng)上,
            用命令行方式運(yùn)行,提示:
            “系統(tǒng)無(wú)法執(zhí)行指定的程序”
            直接雙擊運(yùn)行,提示:
            “由于應(yīng)用程序的配置不正確,應(yīng)用程序未能啟動(dòng),重新安裝應(yīng)用程序可能會(huì)糾正這個(gè)問(wèn)題”

            以前用VC6和VS2003的話, 如果缺少庫(kù)文件,是會(huì)提示缺少“**.dll”,但是用VS2005卻沒(méi)有這樣的提示。

            自己實(shí)驗(yàn)了一下,感覺(jué)以下幾種解決辦法是可行的:
            方法一:
            在類(lèi)似C:\Program Files\Microsoft Visual Studio 8\VC\redi
            st\Debug_NonRedist\x86\Microsoft.VC80.DebugCRT 下找到了下列文件:

            msvcm80d.dll
            msvcp80d.dll
            msvcr80d.dll
            Microsoft.VC80.DebugCRT.manifest

            把這幾個(gè)文件拷貝到目標(biāo)機(jī)器上,與運(yùn)行程序同一文件夾或放到system32下,就可以正確運(yùn)行了。

            其他release版、MFC程序什么的都是拷redist下相應(yīng)文件夾下的文件就可以了,文件夾后都有標(biāo)識(shí)!

            方法二:
            修改編譯選項(xiàng),將/MD或/MDd 改為 /MT或/MTd,這樣就實(shí)現(xiàn)了對(duì)VC運(yùn)行時(shí)庫(kù)的靜態(tài)鏈接,在運(yùn)行時(shí)就不再需要VC的dll了。

            方法三:

            工程-》屬性-》配置屬性-》常規(guī)-》MFC的使用,選擇“在靜態(tài)庫(kù)中使用mfc”
            這樣生成的exe文件應(yīng)該就可以在其他機(jī)器上跑了。

            方法四:

            你的vc8安裝盤(pán)上找到再分發(fā)包vcredist_xxx.exe和你的程序捆綁安裝
            久久精品国产亚洲av水果派| 久久精品桃花综合| 精品久久久久久亚洲精品 | 欧美精品一本久久男人的天堂 | 国产亚洲精久久久久久无码AV| 91久久国产视频| 久久婷婷五月综合国产尤物app | 亚洲色欲久久久综合网| 国产精品99久久免费观看| 国产精品免费久久| 久久免费视频观看| 久久精品国产亚洲av麻豆蜜芽 | 一本色综合网久久| 久久精品国产秦先生| 国产精品一区二区久久精品涩爱| 人妻少妇久久中文字幕| 色婷婷久久综合中文久久一本| 久久久精品国产sm调教网站| 久久久久噜噜噜亚洲熟女综合| 欧美亚洲色综久久精品国产| 色婷婷噜噜久久国产精品12p | 女人香蕉久久**毛片精品| 久久久国产乱子伦精品作者| 亚洲精品乱码久久久久久中文字幕| 国产国产成人久久精品| 久久香蕉国产线看观看乱码| 久久久国产乱子伦精品作者| 久久亚洲私人国产精品| 国产色综合久久无码有码| 亚洲精品NV久久久久久久久久| 久久久久一区二区三区| 国产精品欧美久久久天天影视| 男女久久久国产一区二区三区| 77777亚洲午夜久久多人| 久久精品人人做人人爽电影| 久久午夜综合久久| 久久精品国产福利国产琪琪| 精品久久国产一区二区三区香蕉 | 精品久久无码中文字幕| 久久精品亚洲中文字幕无码麻豆 | 天天爽天天爽天天片a久久网|