android SDK中添加自定義api

本文的思路:

android APP調用自定義java API,自定義java API調用自定義jni接口


1:在android源碼目錄framework/base下面創建add目錄

add目錄裏面的結構如下:


裏面的Nadd.java android_jnitest_Nadd.cpp 和Android.mk內容如下:


Nadd.java

package android.jnitest;

public class Nadd {

static {

System.loadLibrary("hello_jni");

}

public native int nadd(int a, int b);

}



android_jnitest_Nadd.cpp

#define LOG_TAG "hello-JNI"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <assert.h>
#include "jni.h"
#include "JNIHelp.h"
#include "android_runtime/AndroidRuntime.h"
static jint native_nadd(JNIEnv *env, jobject obj, jint a, jint b)
{
	return (a + b);
}
static JNINativeMethod gMethods[] = {
	{"nadd", "(II)I", (void *)native_nadd},
};
static int register_android_jnitest_Nadd(JNIEnv *env)
{
	return android::AndroidRuntime::registerNativeMethods(env, "android/jnitest/Nadd", gMethods, NELEM(gMethods));
}
jint JNI_OnLoad(JavaVM *vm, void *reserved)
{
	JNIEnv *env = NULL;
	if (vm->GetEnv((void **)&env, JNI_VERSION_1_4) != JNI_OK) {
		printf("Error GetEnv\n");
		return -1;
	}
	assert(env != NULL);
	if (register_android_jnitest_Nadd(env) < 0) {
		printf("register_android_test_hello error.\n");
		return -1;
	}
	return JNI_VERSION_1_4;
}

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PRELINK_MODULE := false
LOCAL_SRC_FILES := \
	android_jnitest_Nadd.cpp
LOCAL_SHARED_LIBRARIES := \
	libandroid_runtime
LOCAL_MODULE := libhello_jni
include $(BUILD_SHARED_LIBRARY)

上面的步驟已經將代碼準備好了

2:修改build/core/pathmap.mk文件


在FRAMEWORKS_BASE_SUBDIRS變量後添加add\,代碼如下
FRAMEWORKS_BASE_SUBDIRS := \
            $(addsuffix /java, \
                core \
                graphics \
                location \
                media \
                opengl \
                sax \
                telephony \
                wifi \
                vpn \
                keystore \
                add \
             )


3:修改frameworks/base/Android.mk 文件


在packages_to_document變量後添加自己源代碼的包名稱,如android/jnitest,結果如下
packages_to_document := \
            android \
            javax/microedition/khronos\
            android/jnitest


4:make update-api

這一步更新api,api文檔在frameworks/base/api/current.txt

5:修改build/target/product/base.mk

在PRODUCT_PACKAGES += \後面添加 libhello_jni

PRODUCT_PACKAGES += \
    20-dns.conf \
    95-configured \
    am \
    android.policy \
    android.test.runner \
    app_process \
    applypatch \
    bmgr \
    bugreport \
    content \
    dhcpcd \
    dhcpcd-run-hooks \
    dnsmasq \
    framework \
    fsck_msdos \
    ime \
    javax.obex \
    libSR_AudioIn \
    libandroid \
    libandroid_runtime \
    libandroid_servers \
    libaudioeffect_jni \
    libaudioflinger \
    libbundlewrapper \
    libcamera_client \
    libcameraservice \
    libchromium_net \
    libdl \
    libdrm1 \
    libdrm1_jni \
    libeffects \
    libiprouteutil \
    libjni_latinime \
    libjnigraphics \
    libmedia \
    libmedia_jni \
    libmediaplayerservice \
    libmtp \
    libnetlink \
    libnetutils \
    libreference-ril \
    libreverbwrapper \
    libril \
    librtp_jni \
    libsensorservice \
    libskia \
    libsonivox \
    libsoundpool \
    libsqlite \
    libstagefright \
    libstagefright_amrnb_common \
    libstagefright_avc_common \
    libstagefright_enc_common \
    libstagefright_foundation \
    libstagefright_omx \
    libstagefright_yuv \
    libsystem_server \
    libusbhost \
    libutils \
    libvisualizer \
    libvorbisidec \
    libwpa_client \
    media \
    media_cmd \
    mediaserver \
    monkey \
    mtpd \
    ndc \
    netcfg \
    netd \
    ping \
    platform.xml \
    pppd \
    pm \
    racoon \
    run-as \
    schedtest \
    screenshot \
    sdcard \
    services \
    settings \
    svc \
    system_server \
    tc \
    vdc \
    vold \
    webview \
    wm\

   libhello_jni


 6:make PRODUCT-sdk-sdk -j 4

 7:編譯好後,自己的sdk會編譯到out/host/linux-x86/下,裏面的android-sdk_eng.xxx_linux-x86就是自己的sdk,在eclipse中選擇自己sdk的路徑

如下圖:我這裏只是介紹,沒有選擇,用戶可以選擇~/out/host/linux-x86/android-sdk_eng.xxx_linux-x86路徑,然後點擊Apply



 8:編寫app測試

eclipse創建一個最簡單的hello工程,
將裏面的MainActivity.java內容替換如下(或者來這裏下載http://download.csdn.net/detail/a624731186/7219509)

package com.example.jnitest;

import android.jnitest.Nadd;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;



public class MainActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Nadd test = new Nadd();

        setTitle("The Native Add Result is "+String.valueOf(test.nadd(30, 30)));

    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}




發佈了32 篇原創文章 · 獲贊 6 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章