Android 開發之 - NDK開發 Hello world!

來源:互聯網
上載者:User

標籤:

 

第一個ndk程式 :

         這裡完成的功能是 用java調用C代碼 來實現輸出一個HelloWorld~

 需要下載ndk -- 百度 , 下載安裝後解壓即可;

 建立一個AndroidProject,然後建立一個jni包。包下建立一個JniTest類。

結構如下:

 

開始JniTest檔案中代碼如下:

 

package com.somnus.androidtest.jni;public class JniTest {         public static native String helloWorldFromJNI();}

布局檔案:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.somnus.androidtest.MainActivity" >    <TextView        android:id="@+id/tv_hello_jni"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world" />    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_below="@id/tv_hello_jni"        android:onClick="onAction"        android:text="點擊我調用JNI" /></RelativeLayout>

 

Main檔案代碼:

package com.somnus.androidtest;import com.somnus.androidtest.jni.JniTest;import android.os.Bundle;import android.support.v7.app.ActionBarActivity;import android.view.View;import android.widget.TextView;public class MainActivity extends ActionBarActivity {    private TextView tv_hello_jni;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        tv_hello_jni = (TextView) findViewById(R.id.tv_hello_jni);    }    public void onAction(View v) {        String mStr = JniTest.helloWorldFromJNI();        tv_hello_jni.setText(mStr);    }}

 

***********************進入正題:***********************

開始得到我們的jni檔案 ----> .c     .h 檔案 以及.mk檔案

 1:開始產生我們的.h 檔案。

步驟如下:

 

 

建立一個 launch configuration 左上方 表徵圖 。 然後我這裡命名為:AndroidNDKDemo 

Location 中是jdk的javah.exe 路徑;eg:  C:\Program Files\Java\jdk1.8.0_25\bin\javah.exe (這是我的jdk路徑)

Working Drectory : ${project_loc}  從Variables中選擇來

Arguments : -classpath ${project_loc}/bin/classes -d ${project_loc}/jni jni ${java_type_name}

注意在選項卡 Refresh中勾上Refresh resources upon completion 

common中 選中 External Tools

最後Apply;

此時就看見目錄下多了一個jni檔案夾   ;jni目錄下有一個xxx_xx_xxx_.h檔案

這時 , 在.h 中就是我們的JniTest中的方法 。然後我們建立一個對應的.c檔案   將.h中的方法複製到.c 檔案中 並不齊括弧 注意不要複製JNIEXPORT

此時我的.h檔案為:

com_somnus_androidtest_jni_JniTest.h

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_somnus_androidtest_jni_JniTest */#ifndef _Included_com_somnus_androidtest_jni_JniTest#define _Included_com_somnus_androidtest_jni_JniTest#ifdef __cplusplusextern "C" {#endif/* * Class:     com_somnus_androidtest_jni_JniTest * Method:    helloWorldFromJNI * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_somnus_androidtest_jni_JniTest_helloWorldFromJNI  (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif

com_somnus_androidtest_jni_JniTest.c

#include <jni.h>#include <string.h>jstring JNICALL Java_com_somnus_androidtest_jni_JniTest_helloWorldFromJNI(JNIEnv *env, jobject mString) {return (*env)->NewStringUTF(env, "HelloWorld! I am from JNI !");}

建立Android.mk檔案

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)#LOCAL_MODULE表示產生的庫的名字,前面的lib和尾碼名不用寫LOCAL_MODULE    := HelloWorldLOCAL_SRC_FILES := com_somnus_androidtest_jni_JniTest.cinclude $(BUILD_SHARED_LIBRARY)

現在我們就開始編譯代碼

開啟JniTest.java

 

還是開啟External Tools Configurations .. 

在new一個檔案 。 Loaction 為ndk-build.com 的路徑 (下載NDK解壓的目錄下)

也要注意Refresh中和Common中的配置

 

好了Run 。。。。

你將會看到 libs中新增了一個armeabi檔案夾 目錄下多了一個libHellowWorld.so檔案

最後的目錄結構:

到現在我們在回到我們的JniTest檔案中 , 寫一個調用方法;如下

JniTest.java

package com.somnus.androidtest.jni;public class JniTest {    static{
    //注意這裡的名字: HelloWorld 是我們在mk檔案中給定的名字 而不是libs下的so檔案名稱 System.loadLibrary("HelloWorld"); } public static native String helloWorldFromJNI();}

然後我們在運行 觸發按鈕 運行圖:

 

 

 

 ok! 到此結束~~

 

Android 開發之 - NDK開發 Hello world!

聯繫我們

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