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,一经查实,立即删除!

相关文章

HtmlGenericControl

HtmlGenericControl 构造函数 (String)使用指定的标记初始化 HtmlGenericControl 类的新实例。命名空间: System.Web.UI.HtmlControls 程序集: System.Web(在 System.Web.dll 中) 语法Public Sub New ( _tag As String _ )public …

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

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

POJ-3635 Full Tank? 变形最短路

题目链接:http://poj.org/problem?id3635 容易想到用二维数组记录状态求最短路,然后用优先队列优化,类似于Dijkstra和BFS。我开始设计的过程是直接直接从当前点向相邻点转移并找出所有可能状态,结果TLE。貌似是无关状态太多了&am…

Android之Bitmap学习总结

BitMap类: public void recycle()——回收位图占用的内存空间,把位图标记为Dead public final boolean isRecycled() ——判断位图内存是否已释放 public final int getWidth()——获取位图的宽度 public final int getHeight()——获取位图的高度 pub…

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

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 有很大的语言改进,使代码更简单、更好。性能有了巨大的提升,我们看到微软的云服务…

excel函数中if android,在Android中阅读Excel

目前我正在开发android开发.根据要求,应用程序应该能够读取Excel文件以进行数据输入.正如其他人从这个主题开始,我已经完成了Java Excel Api和Apache POI,但两者都需要进行一些修改以满足我的要求:JExcel API:– 不能支持XLSXApache POI:– 支…

javaIo流实际应用

/*查看目录下所有的文件*/ package cn.file; import java.io.File;public class Text2 {public static void main(String[] args) {File anew File("F:\\图片");File a1new File("F:\\你的");chek(a1);}public static void chek(File f3) {//查看目录…

Android之网络编程之网络通信几种方式实例分享

这篇文章主要介绍了android 网络编程之网络通信几种方式,有需要的朋友可以参考一下 现在总结了六种方式: (1)针对TCP/IP的Socket、ServerSocket (2)针对UDP的DatagramSocket、DatagramPackage。这里需要注意…

常用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 有很大的语言改进,使代码更简单、更好。性能有了巨大的提升,我们看到微软的云服务…

文章观后感

文章地址http://knowledge100.blog.51cto.com/3448830/793559 这篇文章讲的是三层交换机-vlan间路由配置,主要讲述的是通过实例的方式说明如何在一个典型的快速以太局域网中实现VLAN间路由的问题。通过设置VTP域、配置交换机间中继链路、在核心交换机上创建VLAN、将…

JSP之三大指令

page指令&#xff1a; * import&#xff1a;等同与import语句 <% page import"java.util.*" %> <% page import"java.util.*, java.net.*" %>在一个JSP页面中可以给出多个page指令&#xff0c;而且import是可以重复出现的 <% page import&q…

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

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

Android之项目中如何用好构建神器Gradle?

Gradle虽为构建神器&#xff0c;但感觉学习曲线比较陡峭。Gradle User Guide内容很多&#xff0c;但有点太多了&#xff0c;多的你看不完&#xff0c;Gradle Plugin User Guide一篇文章主要讲了Android相关的配置&#xff0c;看完可能感觉马马虎虎会用&#xff0c;但到了修改一…

JavaScript执行环境 + 变量对象 + 作用域链 + 闭包

闭包真的是一个谈烂掉的内容。说到闭包&#xff0c;自然就涉及到执行环境、变量对象以及作用域链。汤姆大叔翻译的《深入理解JavaScript系列》很好&#xff0c;帮我解决了一直以来似懂非懂的很多问题&#xff0c;包括闭包。下面就给自己总结一下。包括参考大叔的译文以及《Java…

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

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

Azure App Service 上的根证书

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

String.Format和StringBuilder的效率

到底String.Format还是StringBuilder效率更高一点&#xff1f;至于这个问题&#xff0c;直接叫他用强大的武器Reflector了解一下String.Format的方法.结果他很快就找出相关的代码: public static string Format(IFormatProvider provider, string format, params object[] arg…