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

來源:互聯網
上載者:User

項目名: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增加c和c++的開發外掛程式 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

作者:zljpp

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.