如何編寫和調用java的jni程式

來源:互聯網
上載者:User
項目進行接近一個月,很多功能和實現都日漸清晰,為了保證項目進度,用戶端對伺服器(j2ee)請求的驗證模組的開發勢在必行。

由於涉及到安全性和代碼通用性,決定用C語言來實現驗證模組,同時部署到用戶端和伺服器,經過半天的研究終於成功進行jni調用,現將步驟附上:

1.建立一個java工程,目錄是D:\project\MyProject,以下用<project>代替。

2.建立一個jni類:com.mycompany.jni.MyAuthToken,並書寫java的native介面方法和其它代碼。如下:

package com.mycompany.jni;

/**
* @author gansc23
*/
public class MyAuthToken
{
/**
* 產生鑒權token
*
* @param imei 裝置的IMEI號
* @param imsi sim卡的IMESI號
* @param utc 格林威治時間
* @param agent 裝置代理程式。如 "moto mb525"
* @param random 隨機數
* @return
*/
public static native String getToken(
String imei,
String imsi,
String agent,
long timestamp,
int random );
}

3. 命令列進入<project>\src\com\mycompany\jni  目錄,運行命令 javac MyAuthToken.java,將產生的 MyAuthToken.class 檔案剪下到 <project>\bin\com\mycompany\jni 目錄下,覆蓋之前的檔案。

4.命令列進入<project>\bin 目錄,運行命令 javah -jni com.mycompany.jni.MyAuthToken,將產生的 <project>\bin\com_mycompany_jni_MyAuthToken.h 檔案拷貝到 <project>\jni\ 目錄。

5. 在<project>\jni\ 目錄中實現方法和其它的c/c++檔案。假設實現檔案的清單如下:
com_mycompany_MyAuthToken.h (自動產生的,不用修改)
com_mycompany_MyAuthToken.c
aaa.h
aaa.c
bbb.h
bbb.c

6. 將c檔案編譯並打包成庫。
筆者這裡在Windows 7上安裝了Cygwin交叉編譯環境,在java環境和android環境上的指令有少許不同:

6.1 在jdk環境下:

6.1.1 啟動Cygwin,進入/cygdrive/d/project/MyProject/jni 目錄( 即 <project>\jni\ 目錄 ),運行以下命令編譯產生*.o檔案:

gcc -c com_mycompany_MyAuthToken.c aaa.c bbb.c

6.1.2 編譯成功之後,在 <project>\jni 目錄下會產生 com_mycompany_MyAuthToken.oaaa.obbb.o檔案。
再運行以下命令將 *.o 檔案連結成庫檔案:

gcc-3 -mno-cygwin -shared -o myauthtoken.dll com_mycompany_MyAuthToken.o aaa.o bbb.o

6.1.3 將產生的myauthtoken.dll放到 C:\Windows\System32\ 目錄下 (正式開發中應該放到工程目錄中進行調用)。

6.1.4 建立一個測試類別 com.mycompany.MyAuthTokenTester
代碼如下:

package com.mycompany;

import com.mycompany.jni.MyAuthToken;

public class MyAuthTokenTester {

static {
System.loadLibrary("myauthtoken"); // 不要帶尾碼名!!
}

/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
System.out.printf(
MyAuthToken.getToken("imei", "imsi", "agent", 23453252L, 3252) );
}
}

運行 MyAuthTokenTester.main(),OK,大功告成!

6.2 在Android開發環境下

6.2.1 首先下載和解壓Android NDK,筆者這裡下載的是 android-ndk-r5,解壓目錄是 D:\android-ndk\android-ndk-r5

6.2.2 為了方便開發,進入cygwin的安裝目錄,編輯 <cygwin_install>/home/Administrator/.bash_profile檔案,在檔案末尾添加如下命令:

ANDROID_NDK_ROOT=/cygdrive/d/android-ndk/android-ndk-r5
export ANDROID_NDK_ROOT

ndk=/cygdrive/d/android-ndk/android-ndk-r5
export ndk

6.2.3 在項目的 <project>\jni 目錄中建立一個名為 Android.mk的make檔案,編寫內容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := authtokenmodule
LOCAL_SRC_FILES := aaa.c bbb.c \
  com_mycompany_MyAuthToken.c

#LOCAL_PRELINK_MODULE := false

# for logging
LOCAL_LDLIBS := -llog

include $(BUILD_SHARED_LIBRARY)

6.2.4 在項目的 <project>\ 根目錄下建立一個名為 Application.mk的make檔案,編寫內容如下:

# The ARMv7 is significanly faster due to the use of the hardware FPU

# Build both ARMv5TE and ARMv7-A machine code.
#APP_ABI := armeabi armeabi-v7a

#APP_PLATFORM := android-9

APP_PROJECT_PATH := $(call my-dir)

APP_MODULES := authtokenmodule

6.2.5 啟動Cygwin,進入/cygdrive/d/project/MyProject/jni 目錄( 即 <project>\jni\ 目錄 ),運行以下命令:

$ndk/ndk-build

編譯成功後,會在 <project>/libs/armeabi 目錄下產生 libauthtokenmodule.so 庫檔案。

6.2.6 部署jni庫

1)若是部署到真機上則直接將打包好的apk檔案安裝上就ok。 :)

2)若在開發階段部署到模擬器上則要稍微繁瑣一點:
在命令列中運行以下命令:

emulator -avd {your_avd_name} -partition-size 128
adb -s {your_avd_serial} remount

命令列進入 <project>/libs/armeabi 目錄,運行以下命令:

adb -s {your_avd_serial} push libauthtokenmodule.so /system/lib

最後不要忘記將so庫載入到程式進程中  :)

public class SplashActivity {

static {
System.loadLibrary("authtokenmodule"); // 不要帶尾碼名!!
}

...
}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.