標籤:
第一個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!