日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android NDK学习笔记(转)

發布時間:2025/4/14 Android 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android NDK学习笔记(转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

Android系統中的應用程序都是用Java開發的。Android NDK使我們能夠在android上使用C/C++開發的原生代碼。有兩個理由使用NDK: 一是合理的重用現有的代碼;二是在程序中某些關鍵的部分提高執行效率。
這里先講幾個符號的約定:
<project> - 你的Android應用程序工程的目錄
<ndk> - 你的ndk安裝的目錄

捷徑

這里先扯一句題外話 -- 如果你不需要使用NDK開發,只是需要使用第三方用NDK開發的庫,那么你只需要這樣做:
把第三方提供的libxxx.so放到你的<project>/libs/armeabi/下, 然后在程序隨便什么地方中加入
static {
??? System.loadLibray("xxx");
}
就可以使用該庫了。

安裝NDK

NDK的安裝很簡單:
1. 首先要將SDK升級至最新,然后下載ndk(可能要翻#和諧#墻,恩恩)將它解壓到某個目錄<ndk>下。
2. 運行: <ndk>/build/host-setup.sh
3. 如果成功的話就OK了,如果失敗的話檢查一下你是不是下載了正確的ndk版本(例如你的操作系統是linux而下載了windows版的ndk).

Java部分

現在我們用一個很簡單的例子來說明NDK的使用。我們在eclipse中新建一個android工程,其中:
Project Name:jnitest
Build Target: Android 1.6
Application Name: JNI Test
Package Name: org.eshock.jnitest
Create Activity: JNITest

JNITest.java:


package org.eshock.jnitest;

import android.app.Activity;
import android.os.Bundle;

public class JNITest extends Activity {
?? ?public native int plus (int x, int y);
?? ?
??? /** Called when the activity is first created. */
??? @Override
??? public void onCreate(Bundle savedInstanceState) {
??????? super.onCreate(savedInstanceState);
??????? int x = plus(1, 2);
??????? android.util.Log.d("jni", String.valueOf(x));
??? }
?? ?
??? static {
?? ??? ?System.loadLibrary("mylib");
??? }
}


我們只是演示NDK,所以就不要界面了。在這個程序中,我們調用一個c語言編寫的plus(int, int)函數來計算1+2的值,然后在log中打印它。這個庫的名稱叫做mylib。
要使用一個c語言的函數,需要在java中聲明:
public native int plus(int x, int y);
這樣java編譯器就知道這個函數是外部庫中實現的。

C部分


接下來我們使用C語言實現這個plus函數。
創建<project>/jni/mylib.c:


#include <string.h>
#include <jni.h>

JNIEXPORT jint JNICALL
Java_org_eshock_jnitest_JNITest_plus( JNIEnv* env,
????????????????????????????????????????????????? jobject thiz,
????????????????????????????????????????????????? jint x,
????????????????????????????????????????????????? jint y )
{
??? return x + y;
}


這 里我們看到,mylib.c里的plus函數比java里面的plus函數的簽名要復雜了很多,主要是plus前面增加了包名,函數中多了兩個參數,以及 所有的int變成了jint。關于c中類型與jni中類型的對應關系,可以參見jni的相關文檔,例如core Java II中的最后一章。如果你不想去查閱文檔,有一個方法:
首先隨便在某個目錄下創建一個文件JNITest.java:


public class JNITest {
??? public native int plus (int x, int y);
}


然后在命令行下執行:
javac JNITest.java && javah JNITest?
將生成一個文件JNITest.h:


/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JNITest */

#ifndef _Included_JNITest
#define _Included_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
?* Class:???? JNITest
?* Method:??? plus
?* Signature: (II)I
?*/
JNIEXPORT jint JNICALL Java_JNITest_plus
? (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif


這里自動生成了java中native函數對應的簽名,你可以在c代碼中使用它。(記得修改包名)。

Android.mk和Application.mk

Android.mk是一個makefile,用來告訴NDK需要編譯哪些文件,生成哪些模塊。我們創建<jni>/Android.mk文件:


LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE??? := mylib
LOCAL_SRC_FILES := mylib.c

include $(BUILD_SHARED_LIBRARY)


其中LOCAL_PATH表示c源代碼文件的位置;LOCAL_MODULE表示生成的共享庫的名稱;LOCAL_SRC_FILES代表c代碼的文件。不需要把頭文件列在里面;頭文件的依賴關系是ndk自動計算的。

Application.mk的作用是告訴Android SDK需要哪些庫文件。有了它,NDK就可以把庫放在正確的位置。我們創建<project>/Application.mk:


APP_PROJECT_PATH := $(call my-dir)
APP_MODULES????? := mylib


APP_PROJECT_PATH代表android工程所在目錄,在本例中它被放在<project>中; APP_MODULES表示工程需要的庫,如果有多個以空格分開。

編譯共享庫

由于ndk規定Application.mk必須放在<ndk>/apps/project_name,我們在<ndk>下創建一個符號連接:
ln -s <project> <ndk>/apps/jnitest
這樣,我們就可以開始編譯共享庫了:
在<ndk>目錄下運行:
make APP=jnitest


Android NDK: Building for application 'jnitest'
Compile thumb? : mylib <= apps/jnitest/jni/mylib.c
SharedLibrary? : libmylib.so
Install??????? : libmylib.so => apps/jnitest/libs/armeabi


可以看到編譯成功,并在<project>/libs/armeabi/下生成了libmylib.so。

測試

在運行之前,首先確認一下你的工程里面各個文件都齊全,應該類似于這樣:


然后測試,正常的話應該能看到log中有輸出3.

轉載于:https://www.cnblogs.com/qq78292959/archive/2011/11/02/2232880.html

總結

以上是生活随笔為你收集整理的Android NDK学习笔记(转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 四虎影视国产精品 | 天天操天天干天天爱 | 丁香激情综合 | 日本爽妇网 | 伊人情人综合 | 逼逼av| 丰满熟妇被猛烈进入高清片 | 99成人免费视频 | 色呦呦网| 在线免费看黄色片 | 精品产国自在拍 | 亚洲福利一区二区三区 | 日本一级做a爱片 | 免费大片在线观看www | 国产在线观看成人 | 久久av免费观看 | 欧美三级欧美成人高清 | 六月婷婷综合网 | 欧美啪啪一区二区 | 91伦理视频| 手机av免费在线观看 | 亚洲综合伊人久久 | 五月在线视频 | 国产视频精品在线 | 伊人av综合网 | 性欧美www| 天天看天天爽 | 国产中文字幕在线观看 | 日韩欧美国产成人精品免费 | 亚洲国产精品毛片av不卡在线 | 在线观看免费视频国产 | 国产三级免费观看 | 国产精品色图 | 亚洲成人精品一区二区 | 黄色片播放器 | 久久国产在线观看 | 久久无码国产视频 | 国产精品一级二级三级 | 口爆吞精一区二区三区 | 日本成人在线一区 | 免费黡色av| 伊人春色影院 | 国产成人在线网站 | 国产精品福利网站 | 国产精品国产精品国产专区 | 亚洲少妇网站 | 亚洲性视频网站 | 日本欧美色 | 一本之道高清无码视频 | 好吊日免费视频 | 亚洲自拍偷拍第一页 | 国产一区二区波多野结衣 | av影视在线观看 | 成人午夜免费福利 | 精品亚洲国产成人av制服丝袜 | 波多一区| av色在线| 久久久.com| 正在播放91 | 伊人资源 | 国产精品久久久午夜夜伦鲁鲁 | www.99色 | 国产精品 欧美激情 | 亚洲论理| 在线观看欧美视频 | 午夜久久久久久久久久 | 亚洲一线在线观看 | 久久尹人 | 日本va欧美va欧美va精品 | 国产精品4区 | 成人六区 | 青青草原在线免费 | 国产精品久久久久久久免费大片 | 日韩1024| 国精产品一区一区三区有限公司杨 | 日韩大片在线免费观看 | 男生c女生 | 这里精品 | 久久久久在线视频 | 中文字幕久久久 | 伊人影院中文字幕 | 久久午夜精品视频 | 欧美日韩不卡一区二区 | 新狠狠干| 羞羞影院体验区 | 久久精品视频9 | 精品美女久久久 | 午夜一区二区视频 | 黄色三级三级 | 午夜福利123 | 久久人人妻人人人人妻性色av | 91亚洲国产精品 | 亚洲午夜影视 | 东京久久久 | 69亚洲| 激情一区二区三区 | 成人午夜影片 | 天堂网av2014| 波多野结衣家庭主妇 |