我的家園

          我的家園

          android之搭建JNI開發環境及簡單案例

          Posted on 2012-07-02 00:03 zljpp 閱讀(1267) 評論(0)  編輯  收藏

          項目名:HelloFromC

          一、在開始jni編程之前對我們使用的環境進行如下配置:(在windows環境下)

          1、下載android-ndk-r7b,解壓放在C:\android-ndk-r7b目錄下。(方便輸入命令,也可以自定目錄)

          2、下載cygwin。

             安裝的時候,最高版本進行安裝。

          3、配置NDK的 cygwin環境變量 

          為了方便直接在命令行里面使用ndk-build

          需要給cygwin的環境變量里面添加ndk的目錄

          目錄/etc/profile/


          4、運行cygwin。(可輸入如下命令:make -v ,gcc -v)

          輸入make -v 

          顯示出來 GNU Make 的版本 ,說明我們的cygwin模擬的linux編譯環境 模擬成功了.


          二、為eclipse增加cc++的開發插件 CDT插件

          Help中的install new software

          選擇 Helios- http//download.eclipse.org/release/helios

          等待展開,選擇Programing language

          選擇c/c++ 開發工具

          一路next下去。 

          同意licenses

          安裝成功會提示是不是確認重啟eclipse,重啟就完成安裝。


          三、JNI簡單案例:

          Java代碼調用一個C方法打印HelloFromC


          MainActivity:

          package com.csdn.hello;

          import android.app.Activity;
          import android.os.Bundle;
          import android.view.View;
          import android.widget.Toast;

          public class MainActivity extends Activity {
              
              static{
                  System.loadLibrary("Hello");//加載
              }
              
              public void onCreate(Bundle savedInstanceState) {
                  super.onCreate(savedInstanceState);
                  setContentView(R.layout.main);
              }
              
              public native String helloFromC();
              public native String hello_from_c();
              
              
              public void onClick(View view){
                  String result= helloFromC();
                  Toast.makeText(this,result , 0).show();
              }
              

          }


          main.xml:

          <?xml version="1.0" encoding="utf-8"?>
          <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical" >

              <Button
                  android:onClick="onClick"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:text="HelloFromC" />

              
          </LinearLayout>

          cmd 進入eclipse中安卓工程HelloFromC的目錄:

          D:\WorkSpace\HelloFromC\bin\classes

          輸入: javah com.csdn.hello,MainActivity

          生成該文件對應的頭文件:com_csdn_hello_MainActivity.h

          在HelloFromC根目錄下建立名為jni的文件夾;

          將其復制到該目錄下;

          com_csdn_hello_MainActivity.h:

          /* DO NOT EDIT THIS FILE - it is machine generated */
          #include <jni.h>
          /* Header for class com_itheima_hello2_MainActivity */

          #ifndef _Included_com_itheima_hello2_MainActivity
          #define _Included_com_itheima_hello2_MainActivity
          #ifdef __cplusplus
          extern "C" {
          #endif
          /*
           * Class:     com_itheima_hello2_MainActivity
           * Method:    helloFromC
           * Signature: ()Ljava/lang/String;
           */
          JNIEXPORT jstring JNICALL Java_com_csdn_hello_MainActivity_helloFromC
            (JNIEnv *, jobject);

          #ifdef __cplusplus
          }
          #endif
          #endif


          jni目錄下加入Android.mk文件:

             #local_path 代表的是當前android.mk文件所在的路徑
             #$() 代表的是一個函數.
             LOCAL_PATH := $(call my-dir)

            #CLEAR_VARS 清空變量 
            # 清空所有以LOCAL_ 開頭的變量里面的內容 (不會清空LOCAL_PATH里面的數據);
             include $(CLEAR_VARS)

           # 定義編譯后的 c代碼庫 的名稱.
             LOCAL_MODULE    := Hello
            #定義makefile 編譯的源文件
            #依賴的頭文件 是不需要指定的.
             LOCAL_SRC_FILES := Hello.c

             #生成一個動態的代碼庫
             include $(BUILD_SHARED_LIBRARY)
             # include $(BUILD_STATIC_LIBRARY); 生成一個靜態的代碼庫
             # 靜態代碼庫的作用 主要就是用來提供一些庫函數 編譯的時候 可能需要用到靜態代碼庫.
             


          并編寫Hello.c文件:

          #include "com_csdn_hello_MainActivity.h"

          JNIEXPORT jstring JNICALL Java_com_csdn_hello_MainActivity_helloFromC
            (JNIEnv * env, jobject obj){
             return (*env)->NewStringUTF(env,"Hello From C");
           }

          打開cygwin

          輸入 cd..

          cd ..

          切換到linux根目錄下

          然后進入到應用程序目錄

          cd cydrive/d/WorkSpace/HelloFromc

          ndk-build 進行編譯,生成動態庫:

          在D:\WorkSpace\HelloFromC2\obj\local\armeabi下會自動生成

          libHello.so文件


          最后在如上的MainActivity中的static代碼塊中加載動態庫,即Android.mk中LOCAL_MODULE    := Hello 變量的值

          然后部署應用程序,點擊按鈕即可利用土司打印出結果 HelloFromC


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 喀喇| 双峰县| 灵山县| 张家川| 镇雄县| 孟州市| 竹山县| 股票| 伊金霍洛旗| 鄂尔多斯市| 江孜县| 准格尔旗| 通化市| 平湖市| 句容市| 金乡县| 青神县| 巴东县| 内黄县| 日照市| 滦平县| 台东县| 永川市| 新安县| 五台县| 和林格尔县| 成安县| 渝北区| 繁峙县| 屯昌县| 永清县| 正阳县| 札达县| 邵武市| 陇川县| 哈密市| 调兵山市| 建水县| 宣武区| 怀安县| 旌德县|