Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android之搭建JNI開發環境及簡單案例

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

編輯:關於Android編程

項目名: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
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved