我的家園

          我的家園

          項目名:HelloFromC

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

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

          2、下載cygwin。

             安裝的時候,最高版本進(jìn)行安裝。

          3、配置NDK的 cygwin環(huán)境變量 

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

          需要給cygwin的環(huán)境變量里面添加ndk的目錄

          目錄/etc/profile/


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

          輸入make -v 

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


          二、為eclipse增加cc++的開發(fā)插件 CDT插件

          Help中的install new software

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

          等待展開,選擇Programing language

          選擇c/c++ 開發(fā)工具

          一路next下去。 

          同意licenses

          安裝成功會提示是不是確認(rèn)重啟eclipse,重啟就完成安裝。


          三、JNI簡單案例:

          Java代碼調(diào)用一個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 進(jìn)入eclipse中安卓工程HelloFromC的目錄:

          D:\WorkSpace\HelloFromC\bin\classes

          輸入: javah com.csdn.hello,MainActivity

          生成該文件對應(yīng)的頭文件:com_csdn_hello_MainActivity.h

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

          將其復(fù)制到該目錄下;

          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 代表的是當(dāng)前android.mk文件所在的路徑
             #$() 代表的是一個函數(shù).
             LOCAL_PATH := $(call my-dir)

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

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

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


          并編寫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根目錄下

          然后進(jìn)入到應(yīng)用程序目錄

          cd cydrive/d/WorkSpace/HelloFromc

          ndk-build 進(jìn)行編譯,生成動態(tài)庫:

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

          libHello.so文件


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

          然后部署應(yīng)用程序,點擊按鈕即可利用土司打印出結(jié)果 HelloFromC


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 永州市| 邵阳县| 胶南市| 丹巴县| 凭祥市| 重庆市| 湖北省| 玉山县| 鸡东县| 图木舒克市| 马鞍山市| 凌海市| 五家渠市| 鹤壁市| 宜君县| 汤原县| 凤庆县| 白山市| 屯昌县| 六安市| 柳江县| 保德县| 建宁县| 独山县| 绵阳市| 当阳市| 威信县| 梨树县| 郴州市| 宁阳县| 阳江市| 庐江县| 宁晋县| 称多县| 浠水县| 深水埗区| 瑞丽市| 阿巴嘎旗| 淮安市| 大化| 卢湾区|