android學習之jni編程初探

來源:互聯網
上載者:User

標籤:

使“java+c”的開發方式成為了官方支援的開發方式,NDK的本質就是為了讓Android應用程式能方便的使用JNI技術而提供的一套工具集合,使用NDK主要是4大好處,第一個,代碼的保護,,由於apk的java層代碼很容易被反編譯,而c/c++反組譯碼難度較大;第二個,可以很方便的使用開源庫,因為很多的現存的開源庫都是c/c++代碼編寫的;第三個,提高程式的執行效率,第四個,便於移植,使用c/c++寫的庫可以方便在其它的嵌入式平台上使用.這裡還有一個問題就是如果在模擬器上啟動並執行話,我們只能在ARM上運行,並不能在intel上運行,否則會無法載入那個so庫檔案

NDK環境搭建

第一步:下載NDK

第二步:建立一個Android工程

第三步:在該工程目錄的根目錄下建立一個jni目錄,用來作為ndk的編譯路徑(NDK的指令碼會根據jni目錄中的c/c++檔案以及mk檔案進行編譯產生so檔案)

第四步:建立builder(builder會使用ndk中的工具將jni目錄中的檔案編譯成為so檔案)Project->Properties->Builders->New->Program






對了,這段代碼實現的功能就是進行兩個int的加減,

這裡我們首先需要建立一個java檔案

package com.jk.ndkdemo;public class NDKBridge {public  native int add(int a,int b);}

然後我們通過jdk中javah工具,根據NDKBridge類產生.h,在使用命令列時,我們要先進入到bin\clsses javah com.jk.ndkdemo.NDKBridge,產生的.h的命名的規則是包名_類名.h

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_jk_ndkdemo_NDKBridge */#ifndef _Included_com_jk_ndkdemo_NDKBridge#define _Included_com_jk_ndkdemo_NDKBridge#ifdef __cplusplusextern "C" {#endif/* * Class:     com_jk_ndkdemo_NDKBridge * Method:    add * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_jk_ndkdemo_NDKBridge_add  (JNIEnv *, jobject, jint, jint);#ifdef __cplusplus}#endif#endif

接下來我們根據h檔案中的內容,在jni目錄中建立c檔案

#include "com_jk_ndkdemo_NDKBridge.h"#include <stdlib.h>#include <stdio.h>#ifdef __cplusplusextern "C"{#endifJNIEXPORT jint JNICALL Java_com_jk_ndkdemo_NDKBridge_add  (JNIEnv *env, jobject obj, jint a, jint b){//將jni類型轉換成C類型int a1 = a;int b1 = b;int c1 = a1 + b1;//將C類型轉成JNI類型jint c = c1;return c;}#ifdef __cplusplus}#endif
然後我們建立mk檔案

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := MyNDKDemoLOCAL_SRC_FILES := com_jk_ndkdemo_NDKBridge.cinclude $(BUILD_SHARED_LIBRARY)

這裡的LOCAL_MODULE就是我們產生的so檔案的名字,LOCAL_SRC_FILES就是我們根據這個檔案來建立的,一旦我們儲存,那麼就會自動產生so檔案



然後我們就需要先載入so檔案,然後就可以使用了,這個步驟在activity中實現

package com.jk.ndkdemo;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.widget.Toast;public class MainActivity extends Activity {// 載入so檔案static {System.loadLibrary("MyNDKDemo");}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 獲得含有jni方法的對象NDKBridge bridge = new NDKBridge();// 調用jni方法int t = bridge.add(3, 5);Toast.makeText(this, "" + t, Toast.LENGTH_SHORT).show();}}

好了,一個簡單的jni編程就完成了。


android學習之jni編程初探

聯繫我們

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