技術博文2016/10/20

【蘇州APP開發】android搭建JNI開發環境及簡單案例

專案名: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:
#include <jni.h>

#ifndef _Included_com_itheima_hello2_MainActivity
#define _Included_com_itheima_hello2_MainActivity
#ifdef __cplusplus
extern “C” {
#endif

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

本文來自新浪部落格