Thứ Năm, 31 tháng 3, 2011

SWFmill - FlashLite for Mobile solution

Các dòng mobile hỗ trợ truyền tham số (params) qua URL hay qua thẻ nhúng Object rất hạn chế. SOFTBANK, DOCOMO, AU có cách truyền tham số khác nhau, việc tùy biến hiện thị FlashLite với các tham số hoặc load động bằng loadMovie gặp nhiều khó khăn (VD: Hiện thị tốt được trên DOCOMO thì AU và SOFTBANK ko hiện thị đc và ngược lại).

[caption id="attachment_67" align="aligncenter" width="530" caption="SWFmill chuyển đổi XML - SWF"]SWFmill chuyển đổi XML - SWF[/caption]

SWFmill là công cụ cho phép dịch 2 chiều XML và SWF. Các tham số của FlashLite có thể đưa vào từ XML và thông qua SWFmill, trả về kết quả duy nhất là 1 file swf với nội dung mong muôn đã được tùy biến. Việc này vừa giải quyết được vấn đề tham số và tùy biến FlashLite trên các JP-phone vừa tối ưu được dung lượng hiện thị vốn đã phải giói hạn nhiều trên mobile (<100KB)

Cài đặt và sử dụng SWFmill:
Chú ý: Hiện nay bản mới nhất của SWFmill là 0.3.1 tuy nhiên việc compile từ source của version này đang gặp lỗi (tác giả cũng chưa biết nguyên nhân). Nên dùng phiên bản 0.3.0.

Tải source code về:

$ wget http://www.swfmill.org/releases/swfmill-0.3.0.tar.gz
$ tar zxvf swfmill-0.3.0.tar.gz
$ cd ./swfmill-0.3.0/


Cài đặt các thư việc để compile:

~/swfmill-0.3.0$ yum install libxml2-dev
~/swfmill-0.3.0$ yum install libxslt-dev
~/swfmill-0.3.0$ yum install libfreetype6-dev
~/swfmill-0.3.0$ yum install libpng12-dev


Build và cài đặt:

~/swfmill-0.3.0$ ./configure
~/swfmill-0.3.0$ make
~/swfmill-0.3.0$ make install


Sau khi cài đặt, chạy sẽ gặp lỗi:

$ swfmill -h
swfmill: error while loading shared libraries: libswft.so.0: cannot open shared object file: No such file or directory


Cần chạy lệnh sau để set lại cấu hình:

$ /sbin/ldconfig


Hoàn tất cài đặt. Bây giờ có thể chạy swfmill để xem các lệnh có thể thực thi:

$ swfmill -h

Thứ Tư, 30 tháng 3, 2011

Solrphpclient,khởi tạo và lấy dữ liệu từ solr

Ở bài trước mình đã hướng dẫn cách cài đặt apache-tomcat và apache-solr,các bạn có thể xem tại đây : http://i-php.net/2011/03/h%c6%b0%e1%bb%9bng-d%e1%ba%abn-cai-d%e1%ba%b7t-va-c%e1%ba%a5u-hinh-apache-solr/.

Thứ Tư, 23 tháng 3, 2011

Translate với bing

Hiện nay việc dùng đa ngôn ngữ trong các website là một điều tất yếu,với các phần ngôn ngữ tĩnh thì bạn bỏ thời gian ra dịch là một điều hợp lý,nhưng với các nội dung động thì không hẳn lúc nào bạn cũng có một đội ngũ ngồi dịch những nội dung này.Vì vậy việc áp dụng các công cụ tự động dịch các nội dung này sẽ giúp bạn tiết kiệm nhiều thời gian và tiền bạc :D.Nhưng nó cũng có mặt hạn chế là câu cú và nội dung dịch còn sai nhiều,nhưng nhìn chung người đọc vẫn hiểu được nội dung bài viết của bạn nói vè cái gì :D.

Trước hết để sử dụng được bing translate bạn cần vào link sau  để dăng ký một appID. http://www.bing.com/developers/createapp.aspx

$appId = "*********1F2C7EE5EE7D5A85F59D43C"; //thay thế bằng appId của bạn vừa đăng ký
$from = "en"; //ngôn ngữ gốc
$to = "fr"; //ngôn ngữ cần dịch

$text = "chuỗi cần dịch";

$detectUri = "http://api.microsofttranslator.com/v2/Http.svc/Translate?appId=".$appId."&text=".$text."&from=".$from."&to=".$to; //link trả về kết quả translate.

Giờ nhiệm vụ của bạn hết sức đơn giản dùng file_get_contents hoặc curl,.. để get nội dung translate về

vd :file_get_contents($detectUri);

Lưu ý: vì việc translate truyền dưới dạng url lên bạn cần phải sử lý dữ liệu truyền lên url một chút để link không bị lỗi do một số ký tự đặc biệt.

mình tạm thời dung cái này:

$text = preg_replace("/[^a-zA-Z 0-9.,;\=\-\_\'\"\<\>:\\ \/]+/"," ",$text);
$text = preg_replace("/[ ]+/","+",$text);

các thẻ trả về sẽ bị chuyển thành &lt; ,...

bạn cần replace chúng

$content = str_replace(array("&lt;","&gt;"), array("<",">"), file_get_contents($detectUri));

Dữ liệu trả về sẽ bị bao bọc bởi thẻ
<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/"></string>
bạn chỉ cần remove nó đi là xài được :D
$content = strip_tags($content,"<br><p><b><i><a><img>"); dung tạm cái này vì lười viết
regexp :D bạn liệt kê những thẻ muốn giũ lại là được :D
ok vậy là nội dung translate đã khá sạch sẽ,bạn chỉ cần insert và database là ok :D.

Thứ Ba, 22 tháng 3, 2011

OOP - một số lưu ý khi tạo class

Class bao gồm các đặc tả & hành vi nhằm mô tả thuộc tính của object. Dưới đây là một số lưu ý nhỏ nhưng hữu ích mà chúng ta có thể cân nhắc khi tạo mới một class nào đó.

1. dữ liệu nên là private.
2. dữ liệu nên được khởi tạo trong (các) hàm constructor.
3. tránh sử dụng quá nhiều kiểu dữ liệu cơ bản để mô tả, nên tách thành các class khác trong trường hợp này.
4. tên của class nên phản ánh chính xác nhất trách nhiệm & vai trò của nó.
5. một class không nên gánh vác quá nhiều việc.
6. nên sắp xếp việc khai báo các fields một cách có trật tự (theo tứ tự chữ cái, hoặc gom nhóm thành từng kiểu logic, kiểu dữ liệu ...).
7. có thể không phải tất cả các field đều có thể truy cấp (cần có hàm get/set)




    Phần thưởng:

    • ai trả lời được "tại sao?" cho các ý 1, 2, 5, 7 sẽ có quà :D

    • ai trả lời được câu trên và cho ví dụ được các ý 3, 4, 6 sẽ có quà to hơn :D--- mại dô!

    Thứ Ba, 15 tháng 3, 2011

    Thứ Hai, 14 tháng 3, 2011

    Hướng dẫn cài đặt và cấu hình apache solr

    Khi làm việc với dữ liệu lớn thì các câu lệnh search sử dụng like sẽ là một điều khung khiếp, để giảm tải được điều này và đảm bảo server của bạn giảm tải được khối lượng công việc thì solr là một giải pháp thay thế khá tốt.Với bài viết này mình không đi sâu quá về solr,mà chỉ giới thiệu một số cách cài đặt và cấu hình cơ bản để solr có thể chạy trên server của bạn.(chỉ áp dụng với server linux).

    Trước tiên bạn tải bản apache tomcat mới nhất  hiện tại :D:apache-tomcat-7.0.11

    wget http://mirror-fpt-telecom.fpt.net/apache/tomcat/tomcat-7/v7.0.11/bin/apache-tomcat-7.0.11.tar.gz.

    tar xvzf apache-tomcat-7.0.11.tar.gz //giải nén

    tải apache solr:

    wget http://mirror-fpt-telecom.fpt.net/apache//lucene/solr/1.4.1/apache-solr-1.4.1.tgz
    tar xvzf apache-solr-1.4.1.tgz //giải nén

    copy apache-solr-1.4.1.war trong apache-solr-1.4.1/dist vào apache-tomcat-7.0.11/webapps sau đó edit lại tên file thành solr.war

    cp /apache-solr-1.4.1/dist/apache-solr-1.4.1.war /apache-tomcat-7.0.11/webapps/solr.war

    vào thư mục bin của apache-tomcat-7.0.11 khởi động apache tomcat

    cd apache-tomcat-7.0.11/bin/

    ./startup.sh //khoi dong apache tomcat

    Tìm file web.xml trong apache-tomcat-7.0.11/webapps/solr

    cd ~

    cd apache-tomcat-7.0.11/webapps/solr

    nano web.xml

    sửa đoạn sau

    <env-entry>
    <env-entry-name>solr/home</env-entry-name>
    <env-entry-value>đường dẫn tuyệt đối tới thư mục /apache-solr-1.4.1/example/solr</env-entry-value>
    <env-entry-type>java.lang.String</env-entry-type>
    </env-entry>

    Việc tiếp theo chỉ cần khởi động lại apache tomcat la ok :).

    Để kiểm tra lại bạn vào linh http://localhost:8080/solr nếu xuất hiện dòng chữ

    Welcome to Solr!


    nghĩa là quá trình cài đặt của bạn đã thành công :D

    Thứ Sáu, 11 tháng 3, 2011

    Create table using ul - li

    Ví dụ về cách dùng ul li để tạo bảng.

    HTML



    <ul>
    <li class="heading"><span>Table header</span></li>
    <li class="odd"><span>Row header 1</span></li>
    <li><span>Row header 2</span></li>
    <li class="odd"><span>Row header 3</span></li>
    <li><span>Row header 4</span></li>
    <li class="last"><span>Footer</span></li>
    </ul>
    <ul>
    <li class="heading"><span>Column header 1</span></li>
    <li class="odd"><span>Lorem ipsum</span></li>
    <li><span>Lorem ipsum</span></li>
    <li class="odd"><span>Lorem ipsum</span></li>
    <li><span>Lorem ipsum</span></li>
    <li class="last"><span>&nbsp;</span></li>
    </ul>
    <ul>
    <li class="heading"><span>Column header 2</span></li>
    <li class="odd"><span>Dolor sit amet</span></li>
    <li><span>Dolor sit amet</span></li>
    <li class="odd"><span>Dolor sit amet</span></li>
    <li><span>Dolor sit amet</span></li>
    <li class="last"><span>&nbsp;</span></li>
    </ul>
    <ul>
    <li class="heading"><span>Column header 3</span></li>
    <li class="odd"><span>Lorem ipsum</span></li>
    <li><span>Lorem ipsum</span></li>
    <li class="odd"><span>Lorem ipsum</span></li>
    <li><span>Lorem ipsum</span></li>
    <li class="last"><span>Footer data</span></li>
    </ul>

    CSS



    ul, li {
    margin: 0;
    padding: 0;
    list-style: none;
    }
    ul {
    float: left;
    }
    ul li {
    border-right: 1px solid #fff;
    border-bottom: 1px solid #fff;
    color: #fff;
    background: #87C409;
    }
    ul li.odd {
    background: #76AB07;
    }
    ul.first-col li {
    font-weight: bold;
    }
    ul li.heading {
    font-weight: bold;
    background: #5A8406;
    margin-top: 5px;
    }
    ul li span {
    padding: 10px;
    display: block;
    }

    /* hightlight */
    ul.hightlight li {
    background: #699906;
    }
    ul.hightlight li.heading {
    background: #415F03;
    margin-top: 0;
    padding-top: 5px;
    }
    ul.hightlight li.odd {
    background: #557B04;
    }

    /* footer */
    ul li.last {
    background: #5A8406;
    border: none;
    }
    ul.last-col li.last {
    text-align: right;
    }
    ul li.last span {
    padding: 5px 10px;
    }

    Kết quả:


    Untitled Document





    • Table header

    • Row header 1

    • Row header 2

    • Row header 3

    • Row header 4

    • Footer



    • Column header 1

    • Lorem ipsum

    • Lorem ipsum

    • Lorem ipsum

    • Lorem ipsum

    •  



    • Column header 2

    • Dolor sit amet

    • Dolor sit amet

    • Dolor sit amet

    • Dolor sit amet

    •  



    • Column header 3

    • Lorem ipsum

    • Lorem ipsum

    • Lorem ipsum

    • Lorem ipsum

    • Footer data




    Thứ Bảy, 5 tháng 3, 2011

    Faux Colums & Column 2-1-3

    Faux Column : là một kỹ thuật dùng để làm cho các thẻ div có chiều cao bằng nhau. (giống như khi ta dùng thẻ 'td' trong table)
    Sau đây là ví dụ :
    Chúng ta sẽ tạo ra 3 cột bằng cách dùng 5 thẻ div lồng nhau (main-content, main-content_1, main-content_2, main-content_3, main-content_4) và 3 thẻ div (content-center, content-left, content-right), 3 thẻ div này là phần nội dung sẽ được hiển thị. Ta sẽ quy định phần bên trái và bên phải sẽ có chiều rộng là 25%, còn phần giữa sẽ là 50%.)

    HTML :
    <div id="main-content">
    <div id="main-content_1">
    <div id="main-content_2">
    <div id="main-content_3">
    <div id="main-content_4">
    <div id="content-center"></div>
    <div id="content-left"></div>
    <div id="content-right"></div>
    <div class="clear"></div>
    </div>
    </div>
    </div>
    </div>
    </div>

    CSS :
    .clear {
    clear: both;
    }
    div#main-content {
    background: #a8a8a8;
    width: 960px;
    margin: 0 auto;
    }
    div#main-content_1 {
    background: #4200ff;
    }
    div#main-content_3 {
    background: #ff0c00;
    }


    Đặt các thẻ div vào vị trí mình mong muốn bằng cách sử dụng thuộc tính position: relative
    div#main-content {
    background: #a8a8a8;
    width: 960px;
    margin: 0 auto;
    position: relative;
    }

    div#main-content_1,
    div#main-content_2,
    div#main-content_3,
    div#main-content_4 {
    position: relative;
    width: 100%;
    }


    Đầu tiên chúng ta sẽ cho thẻ div : main-content_1 dịch sang bên trái là 75%
    div#main-content_1 {
    background: #4200ff;
    right: 75%;
    }


    Tiếp đến là cho thẻ div : main-content_2 dịch sang bên phải là 75% để trở về vị trí ban đầu
    div#main-content_2 {
    left: 75%;
    }

    Làm tương tự như vậy với thẻ div : main-content_3 và main-content_4 nhưng với vị trí lần lượt là phải và trái
    div#main-content_3 {
    background: #ff0c00;
    left: 75%
    }
    div#main-content_4 {
    right: 75%
    }


    Dùng thuộc tính overflow: hidden để ẩn đi phần thừa
    div#main-content {
    background: #a8a8a8;
    width: 960px;
    margin: 0 auto;
    position: relative;
    overflow: hidden;
    }


    Vậy là xong được 1 phần. Bây giờ sẽ là phần nội dung hiển thị. Ở phần này, mình sẽ sử dụng column : 2-1-3. Việc này khá tốt để làm SEO. Chúng ta sẽ đặt phần nội dung chính lên đầu tiên rồi tiếp đến là phần nội dung phụ.
    div#content-center,
    div#content-left,
    div#content-right {
    position: relative;
    }
    div#content-center {
    float: left;
    left: 25%;
    width: 50%;
    }
    div#content-left {
    float: left;
    left: -50%;
    width: 25%;
    }
    div#content-right {
    float: right;
    width: 25%;
    }

    Thêm 1 chút nội dung vào. Đây là kết quả




    Thứ Sáu, 4 tháng 3, 2011

    Lập trình yahoo messenger bot với php

    Đây là cách viết sử dụng qua officer api của yahoo .

    1. Đăng ký yahoo developer :

    http://developer.yahoo.com/

    2. Create 1 project . (Nhớ là non web project nhé)

    https://developer.apps.yahoo.com/projects

    Grant quyền access vào YM cho project
    Trong phần Permissions , kéo xuống tìm Yahoo! Messenger -> Full Access


    3. Download lib , implement sẵn api

    https://github.com/yahoo/messenger-sdk-php

    4.Sửa code 1 chút :

    Sửa file client.php

    define('USERNAME', 'ha_bogay'); // your username
    define('PASSWORD', 'xxxxxx'); // your password
    define('CONSUMER_KEY', 'dj0yJmk9UkhiejdNNHN5VjVhJmQ9cccWVdrOVMyZERUSE5hTm04bWNHbzlOREF6TURJMU5UWXkmcz1jb25zdW1lcnNlY3JldCZ4PTk4');
    define('SECRET_KEY', '1a895fdbb3847axxx8dc02cd38bf2b23bb88f2c522d');

    Riêng CONSUMER_KEY và SECRET_KEY lấy sau khi tạo project ở bước 2 .

    Chạy : php client.php

    Tiếp theo là chat với bot .
    Có thể sửa chương trình 1 chút để làm bot xịn , có kịch bản , hay là chương trình spam YM ...

    Thứ Tư, 2 tháng 3, 2011

    PHP_OPENSSL - gửi mail với SMTP server của google.

    Khi website của bạn hosts trên hosting của Nhân Hòa chẳng hạn. Các bác bên ấy thường quên không hỗ trợ thư viện php_openssl cho PHP, nên khi bạn cần sử dụng một kết nối tới địa chỉ như ssl://smtp.gmail.com:465 để gửi mail (việc này sẽ tránh được việc các mail của bạn bị đưa vào danh sách spam khi sử dụng các smtp server khác).

    Đơn giản là nên gọi và yêu cầu hỗ trợ thư viện php_openssl. Em đã từng gọi bên Nhân Hòa nhưng các bác ấy bảo  ... vì lý do bảo mật... Uhm, em không hiểu php_openssl thì ảnh hưởng gì đến bảo mật của các bác ấy. Đơn giản là vì thư viện này không mặc định được mở khi cài đặt PHP đúng không các bác.

    Using Nusoap with PHP

    Lâu lắm rồi ko có j` nổi bật trong công việc để viết bài :D
    Hôm nay, bài toán tôi cần giải quyết là lấy dữ liệu từ các sàn giao dịch Chứng Khoán.
    Mọi vẫn đề đều được giải quyết, đến khi tôi gặp site này : http://www.hsx.vn/hsx/HOSE_Livesecurity.htm
    Ở đây, dữ liệu được load ra bằng ajax, như vậy nếu dùng file_get_contents() thì sẽ ko thể lấy được gì.
    Sau 1 hồi mò mẫm thì ra cái service này, http://www.hsx.vn/LS_VSE/HoSTC_Service.asmx
    Các function để site load dữ liệu ra đều ở đây cả.
    => vấn đề bây giờ là phải tạo 1 Soap Client để làm việc với service, và tôi chọn Nusoap.
    - Download lib tại đây : http://sourceforge.net/projects/nusoap/
    - Download file này : http://www.hsx.vn/LS_VSE/GetDataProxy.aspx?service=HoSTC_Service.asmx

    Ở trong file GetDataProxy.aspx có các function cần dùng, gồm các param, title ....
    Cái tôi quan tâm là function GetLiveSecurity() và param f_time.

    Trong code php, ta làm như sau:


    require_once('lib/nusoap.php');
    $client = new nusoap_client('http://www.hsx.vn/LS_VSE/HoSTC_Service.asmx?WSDL', true);
    $result = $client->call('GetLiveSecurity',array('f_time'=>'true'));
    var_dump($result);
    ?>


    vậy là tôi đã có đầy đủ dữ liệu được site load ra, bây giờ việc còn lại là chặt chém cái $result ra, muốn lấy j` thì lấy \:d/

    Bài toán của tôi chỉ cần có vậy, nếu của bạn phức tạp hơn, cần nhiều hơn thì tham khảo thêm nhé.
    Link tham khảo: http://www.slideshare.net/fulvio.corno/web-services-in-php-using-the-nusoap-library

    Thao tác với DLL bằng Java

    Môi trường triển khai



    • JDK 1.6_0.16

    • Eclipse

    • JUnit

    • VC++ Express 2010



    Mục đích

    File Calc.dll được tạo ra và bao gồm hai phương thức với đặc tả như sau



    • int add (int a, int b)

    • int substract (int a, int b)



    Viết đoạn mã Java sử dụng sẵn hai phương thức đã được viết bằng VC++ và được dịch ra file dll.

    Quy định chung

    Một số tên gọi được giữ nguyên tiếng Anh thay vì viết tiếng Việt.

    Thuật ngữ

    Java = nền tảng Java & ngôn ngữ lập trình Java

    C/C++ = ngôn ngữ lập trình C/C++

    service(s) (trong tài liệu này) = các hàm viết bằng ngôn ngữ lập trình khác java

    Intermediate platform = lớp trung gian giao tiếp giữa ứng dụng viết bằng Java & ứng dụng viết bằng các ngôn ngữ lập trình khác.

    JNI (Java Native Interface) = lớp giao tiếp giúp JVM gọi các services được viết bằng ngôn ngữ lập trình khác.

    JNA (Java Native Access) = truy cập vào các thư viện native mà không phải viết code JNI

    Tổng quát

    Bản thân ngôn ngữ Java không tự gọi được các hàm viết bằng các ngôn ngữ lập trình khác. Vì thế, trong Java Platform có cung cấp Java Native Interface (JNI) cho phép tích hợp chương trình viết bằng Java với những services được tạo ra trên nền tảng khác. JNI định nghĩa các chuẩn đặt tên và cách thức gọi hàm tích hợp trong JVM.

    Kiến trúc



    [caption id="" align="aligncenter" width="571" caption="JNI architecture"]JNI architecture[/caption]




    Các bước gọi hàm trong file dll dịch từ C++



    • viết code java, bao gồm tên hàm & các tham số.

    • biên dịch file java = javac

    • tạo file header (*.h) = javah -jni

    • viết code C++ để thực thi, include file header tạo ra từ code java trên.

    • build mã nguồn C++ ra file dll

    • load file dll vào mã nguồn java và chạy.




    [caption id="" align="aligncenter" width="556" caption="Calling JNI"]Calling JNI[/caption]

    Trên là trường hợp lý tưởng khi có đủ cả mã nguồn & công cụ thực thi của các file dll. Tuy nhiên, trường hợp không thể có mã nguồn của dll mà chỉ có đặc tả kỹ thuật của các phương thức cần dùng thì công việc lại vất vả hơn chút. Đó là phải tự viết code C++ để đọc các

    phương thức từ dll, tức là tự viết lớp intermediate platform ở trên để làm việc kết nối Java & dll (lập trình bằng C/C++)

    Giải pháp khác

    Có nhiều thư viện giải quyết việc giao tiếp giữa mã nguồn Java & dll (C/C++), JNA là một trong số đó với đặc điểm dễ dùng & miễn phí. Những thông tin cần thiết bao gồm



    • download jna.jar

    • import vào dự án (giả sử dùng eclipse)

    • load dll lên và sử dụng, cần có đặc tả kỹ thuật của các phương thức (tên, tham số, kiểu dữ liệu nên chính xác)



    Làm bằng JNI đơn thuần

    1. Viết file Calc.java


    public native int add(int a, int b);

    public static void main(String[] args) {

    Calculator cal = new Calculator();

    int sum = cal.add(1,2);

    }

    2. Biên dịch file Calc.java


    javac Calc.java

    3. Tạo ra file header (*.h) để sử dụng trong mã nguồn C++


    javah -jni Calc

    File Calc.h thu được có nội dung như dưới


    #include <jni.h>

    /* Header for class Calculator */

    #ifndef _Included_Calculator

    #define _Included_Calculator

    #ifdef __cplusplus

    extern "C" {

    #endif

    /*

    * Class: Calculator

    * Method: add

    * Signature: (II)I

    */

    JNIEXPORT jint JNICALL Java_Calculator_add

    (JNIEnv *, jobject, jint, jint);

    #ifdef __cplusplus

    } #

    endif

    #endif

    Trong đó



    • JNIEXPORT jint JNICALL là quy tắc viết giao tiếp của JNI

    • jint là kiểu native của int



    4. Viết mã nguồn C++



    • #include file Calc.h header như trên

    • viết mã nguồn chính




    #include <jni.h>

    #include "Calc.h"

    JNIEXPORT jint JNICALL

    Java_Calc_add(JNIEnv *env, jobject obj, jint a, jint b)

    {

    return a + b;

    }

    5. Dịch mã nguồn C++ thành file dll. Trường hợp đã có sẵn file *.dll, từ bước (1) - (4) thì viết các phương thức theo như đặc tả kỹ thuật của file *.dll nhận được. Tại bước (4), viết các hàm C++ để gọi đến hàm C++ trong file *.dll đó.

    6. Sử dụng file dll vừa dịch trong mã nguồn Java.

    Cách này đòi hỏi người làm vừa phải làm với Java, vừa phải làm với C/C++. Nếu các lập trình viên Java ngại làm việc với C/C++ thì thư viện Java Native Access (JNA) là một trong số những lựa chọn tốt để sử dụng. Lợi ích của nó là có thể tránh cho lập trình viên can thiệp hoặc viết mới mã nguồn C/C++, tức là bỏ qua bước (3), (4) ở trên.

    Sử dụng JNA

    1. Vào website https://jna.dev.java.net/ và download thư viện cần thiết



    • jna.jar

    • platform.jar (không bắt buộc)



    2. Import thư viện jna.jar và viết mã nguồn java


    ○ file Calc.java

    package Calculator;

    import com.sun.jna.*;

    public interface Calc extends Library {

    int add(int a, int b);

    }

    ○ file Cal.java

    package Calculator;

    import com.sun.jna.*;

    public class Cal {

    static Calc init() {

    Calc c = (Calc) Native.loadLibrary("Path/to/Calc",

    Calc.class);

    return c;

    } public static void main (

    String [] args) {

    System.out.println(add(1, 2));

    } public static int add(int a, int b) {

    return init().add(a, b);

    } public static int substract(int a, int b) {

    return init().substract(a, b);

    }

    }

    Có thể gộp 2 files trên thành 1, tuy nhiên, việc viết interface mô tả các phương thức gọi các hàm native làm cho code dễ quản lý hơn.

    Vậy là chạy roài.

    Hai lỗi thường gặp



    • java.lang.UnsatisfiedLinkError: Error looking up function '<function’s name>': The specified procedure could not be found. -> kiểm tra lại chính xác tên hàm, kiểu dữ liệu (native) & tham số.

    • java.lang.UnsatisfiedLinkError: Unable to load library 'C:\Users\nguyen.duc.hoang\Documents\Visual Studio 2010\Projects\Calc\Debug\<library’s name>': The specified module could not be found -> kiểm tra lại tên file dll, đường dẫn đến file, phiên bản build & nền tảng lập trình của file đó.



    Hạn chế của JNA

    Tốc độ chậm hơn JNI native khoảng 10 lần (nghe nói thế), tuy nhiên vẫn có những cách để tăng thêm hiệu suất làm việc (chưa thử). Việc mapping giữa library & functions giữa JNA và native code cũng gặp vấn đề về



    • tính chính xác

    • các kiểu dữ liệu.



    Những yêu cầu của file *.dll dùng được



    • có mô tả chính xác tên hàm, giá trị trả về & tham số truyền vào.

    • có mô tả chi tiết các kiểu dữ liệu, hằng số

    • ngoài ra, file *.dll nên được viết (nếu = C/C++) đúng chuẩn xuất ra dll chứ không phải dll gắn trực tiếp & cố định vào một ứng dụng cụ thể (vì lý do ràng buộc giữ các thư viện - nếu có).

    • có thể xem được tên hàm của file *.dll bằng các chương trình phân tích dll đơn giản.



    Tham khảo thêm



    • website chính của dự án JNA https://jna.dev.java.net/

    • Sheng Liang The Java™ Native Interface (Programmer’s Guide and Specification)