android sdk中添加自定义api,android SDK中添加自定义api【转】

本文的思路:

android APP调用自定义java API,自定义java API调用自定义jni接口

1:在android源码目录framework/base下面创建add目录

add目录里面的结构如下:

e70638739ec4c7c009cbaf533c5b9dd57a5.jpg

里面的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 

#include 

#include 

#include 

#include 

#include 

#include 

#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) 

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

2c78be55b7206d202fc7dbab876e1a8fbbf.jpg

8:编写app测试

eclipse创建一个最简单的hello工程,

将里面的MainActivity.java内容替换如下(或者来这里下载http://download.youkuaiyun.com/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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值