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.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;

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

远程控制利器TeamViewer使用教程(图)

TeamViewer是什么? 他是一款免费的可以穿透内网的远程控制软件,可以实现桌面共享,文件传送等功能,简单一点说就是和QQ远程协助一样,但是比QQ的远程协助功能更为强大。 TeamViewer与木马有什么区别? 说到远程…

千万别让男朋友穿你的短裙......

1 工作太辛苦,我要走了...▼2 应该很有效?▼3 疑车有据!!▼4 这是一部色魔功法...▼5 穿上女友的衣服居然毫无违和感▼视频来源见水印,侵删6 整挺好!▼7 这只有熊猫可以驾驭得了......▼你点的每个赞&…

迎接.NET 6,《dotnet+Linux中文手册》完整PDF开放下载!

昨晚已经正式发布了.NET6,具体参见:https://devblogs.microsoft.com/dotnet/announcing-net-6/。这是.NET团队和社区努力一年的成果,C# 10 和 F# 6 有很大的语言改进,使代码更简单、更好。性能有了巨大的提升,我们看到微软的云服务…

常用MIME类型(Flv,Mp4的mime类型设置)

也许你会在纳闷,为什么我上传了flv或MP4文件到服务器,可输入正确地址通过http协议来访问总是出现“无法找到该页”的404错误呢?这就表明mp4格式文件是服务器无法识别的,其实,这是没有在iis中将相应的MIME类型进行设置的…

史上四大“杀人”建筑,烧掉几百亿,却犯低级错误,网友:有钱人的智商,我不懂

全世界只有3.14 % 的人关注了爆炸吧知识本文转自普象工业设计小站这个世界上有多少荒谬的建筑?国内土味审美的大楼只是冰山一角在更多的国家里耗费巨资,却无比失败的工程比土味大楼更多更荒唐你也许听说过美国这座会跳舞的大桥耗资千万,由优秀…

迎.NET6,今日先送200P全新视频教程 / 源码

昨晚已经正式发布了.NET6,具体参见:https://devblogs.microsoft.com/dotnet/announcing-net-6/。这是.NET团队和社区努力一年的成果,C# 10 和 F# 6 有很大的语言改进,使代码更简单、更好。性能有了巨大的提升,我们看到微软的云服务…

android 横向stepview,Android 流程指示器 StepView

软件介绍StepView 是Android平台下自定义的流程指示器。效果图:使用:android:id"id/step_view0"android:layout_width"match_parent"android:layout_height"wrap_content"android:layout_centerInParent"true"android:text…

58年前,这3个人在“撕逼”中拿下诺贝尔奖!一起研究DNA的女科学家却痛苦去世.........

全世界只有3.14 % 的人关注了爆炸吧知识人类的本质是双螺旋结构1953年4月25日,《自然》杂志发表了一篇不到千字的论文:消息一出,便掀起了科学界的轩然大波。因为这篇短小精悍的论文史无前例地揭示了正确的DNA立体结构。图片仅供参考&#xff…

Azure App Service 上的根证书

点击上方蓝字关注“汪宇杰博客”原文:Amol Mehrotra翻译:Edi Wang导语App Service 有一个受信任的根证书列表,您不能在 App Service 的多租户版本中修改这些证书,但您可以在应用服务环境 (ASE) 的受信任根存储中加载自己的 CA 证书…

jettytomcat对待表单过长问题

为什么80%的码农都做不了架构师?>>> 结论两句话: tomcat知道自己处理不了了,什么也不干过去了 jett知道自己处理不了了,抛个IllegalStateException出来通知一下 jetty默认允许的content-length2001000 org.eclips…

Android之Adapter用法总结

Android之Adapter用法总结 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。如下图直观的表达了Data、Adapter、View三者的关系: Android中所有的Adapter一览: …

那些年,画家发明的黑科技

全世界只有3.14 % 的人关注了爆炸吧知识在现代摄影技术发明之前,获取图像的最佳方式只有绘画。在绘画的时代,如何把事物画的逼真,几乎成为了困扰画家一生的问题。为了准确展现客观世界,让画面看起来更加逼真,古代的艺术…

Android jdwp 自动断开,开启debug调试模式,进入不了,等一会就闪退了!!!!

原因:debug标记加多了art/runtime/jdwp/jdwp_event.cc:661] Check failed: Thread::Current() ! GetDebugThread() (Thread::Current()0xe1908400, GetDebugThread()0xe1908400) Expected event thread11-16 15:29:18.457 10331-10339/包名 A/art: art/runtime/runt…

Visual Studio 2022发布了,我最爱的5大特性

VS2022今天Visual Studio 2022 终于发布了,你只需要按下⾯地址就可以快速安装你所需要的Visual Studio 2022版本,包括了企业版本,专业版本,以及社区版本。请输入以下⽹址安装最新的Visual Studio 2022 https://aka.ms/InstallVS或…

ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发

为什么80%的码农都做不了架构师?>>> ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发 前言:本篇主要讲述数据访问层的开发,而且为了大家交流,已经创建企业项目开发团队&…

22张图片倒叙霍金:我爱宇宙也爱这苦乐人生

全世界只有3.14 % 的人关注了爆炸吧知识▲斯蒂芬威廉霍金(Stephen William Hawking),1942年1月8日出生于英国牛津,21岁时患上肌肉萎缩性侧索硬化症(卢伽雷氏症),全身瘫痪,不能言语&a…

简述LINQ的发展历程

LINQ:最终统治了所有的语言!让我们看看LINQ如何彻底改变了.NET中访问数据的方式.NET与其他技术栈的不同之处之一绝对是LINQ,它是Language Integrated Query的首字母缩写。实际上,它是随.NET Framework 3.5和Visual Studio 2008引入…

PHP开发学习-Apache+PHP+MySQL环境搭建

我现在开始php的学习之旅啦! 入门:开发环境搭建 组件版本: apache2.2.22 下载地址:http://httpd.apache.org/ php5.4.11 下载地址:http://windows.php.net/download/ mysql5.5.29 下载地址:http://www.mys…

如何不露声色地知道别人是不是单身?

1 世界上竟然会有这么香的东西!!!2 全网吧的电脑都死机了,唯独写论文的电脑没死机!3 哈哈哈哈哈哈哈哈哈哈哈好拉风啊!!4 中国好邻居5 《秋游》,五年级男生写的诗图自我们1班王悦微6…

再谈C#中的委托和事件

写在最前我相信全网关于委托和事件的文章和概述,大家应该已经读过很多篇。但是就我的观察来看,大多数文在讲述这方面概念时,都会用烧开水和狗叫主人的例子来讲述事件怎么工作,这样比喻固然与生活联系紧密,但看多了难免…