本文转载自:http://blog.csdn.net/a624731186/article/details/23548409

本文的思路:

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

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

add目录里面的结构如下:

里面的Nadd.java android_jnitest_Nadd.cpp 和Android.mk内容如下:

Nadd.java

  1. package android.jnitest;
  2. public class Nadd {
  3. static {
  4. System.loadLibrary("hello_jni");
  5. }
  6. public native int nadd(int a, int b);
  7. }

android_jnitest_Nadd.cpp

  1. #define LOG_TAG "hello-JNI"
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <fcntl.h>
  8. #include <assert.h>
  9. #include "jni.h"
  10. #include "JNIHelp.h"
  11. #include "android_runtime/AndroidRuntime.h"
  12. static jint native_nadd(JNIEnv *env, jobject obj, jint a, jint b)
  13. {
  14. return (a + b);
  15. }
  16. static JNINativeMethod gMethods[] = {
  17. {"nadd", "(II)I", (void *)native_nadd},
  18. };
  19. static int register_android_jnitest_Nadd(JNIEnv *env)
  20. {
  21. return android::AndroidRuntime::registerNativeMethods(env, "android/jnitest/Nadd", gMethods, NELEM(gMethods));
  22. }
  23. jint JNI_OnLoad(JavaVM *vm, void *reserved)
  24. {
  25. JNIEnv *env = NULL;
  26. if (vm->GetEnv((void **)&env, JNI_VERSION_1_4) != JNI_OK) {
  27. printf("Error GetEnv\n");
  28. return -1;
  29. }
  30. assert(env != NULL);
  31. if (register_android_jnitest_Nadd(env) < 0) {
  32. printf("register_android_test_hello error.\n");
  33. return -1;
  34. }
  35. return JNI_VERSION_1_4;
  36. }

Android.mk

  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_PRELINK_MODULE := false
  4. LOCAL_SRC_FILES := \
  5. android_jnitest_Nadd.cpp
  6. LOCAL_SHARED_LIBRARIES := \
  7. libandroid_runtime
  8. LOCAL_MODULE := libhello_jni
  9. 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;
    }

}

android SDK中添加自定义api【转】的更多相关文章

  1. 腾讯微博java(android)sdk新增微博api详细介绍

    本文主要介绍腾讯微博android sdk中新增微博有关的8个接口,以及使用的示例代码 注意:以下所有的api示例代码都需要先新建QqTSdkService类对象qqTSdkService并初始化,见 ...

  2. Android SDK中的Support兼容包详解

    这篇文章主要介绍了Android SDK中的Support兼容包详解,本文详细区分了Support Library的版本区别.各种Theme的概念和使用注意事项等内容,需要的朋友可以参考下 背景 来自 ...

  3. Android SDK版本号 与 API Level 对应关系 201911

    API是开发用的,所以API LEVEL可以认为是内部的:而SDK的版本提供了新特性给用户,是外部可见的. 可以查看以下网址以获取最新的对应关系:  http://developer.android. ...

  4. 如何解决Android SDK中离线文档打开慢的问题

    原文:http://blog.csdn.net/hansel/article/details/39268511 Android SDK中的离线文档虽然都是本地文件,但是有很多Javascript, C ...

  5. Android SDK版本号 与 API Level 对应关系

    转自:https://blog.csdn.net/qiaoquan3/article/details/70185550 Android SDK版本号 与 API Level 对应关系   新接触And ...

  6. Android SDK版本号与API Level 的对应关系-转

    Android SDK版本号 与 API Level 对应关系 http://developer.android.com/guide/appendix/api-levels.html Android ...

  7. Android SDK版本号与API Level 的对应关系及发布时间(更新到28)

    Android SDK版本号与API Level 的对应关系及发布时间 平台版本号 API 级别 VERSION_CODE(代号) 发布时间 Android 9.0 28 Pie/P(馅饼) 2018 ...

  8. Android SDK中 tools 工具介绍

    Android SDK包含了各种各样的定制工具,简介如下: Android模拟器(Android Emulator ) 它是在你的计算机上运行的一个虚拟移动设备.你可以使用模拟器来在一个实际的Andr ...

  9. Android SDK下载OpenMobile api

    在Android SDK Manager的Tools -> Manager Add-on sites... -> User Defined Sites中,添加以下地址: http://se ...

随机推荐

  1. 51nod 1092 回文字符串【LCS】

    1092 回文字符串 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 回文串是指aba.abba.cccbccc.aaaa这种左右对称的字符串.每个字符 ...

  2. Java并发编程实战 读书笔记(一)

    最近在看多线程经典书籍Java并发变成实战,很多概念有疑惑,虽然工作中很少用到多线程,但觉得还是自己太弱了.加油.记一些随笔.下面简单介绍一下线程. 一  线程与进程   进程与线程的解释   个人觉 ...

  3. sql server 博客

    http://blog.csdn.net/tjvictor/article/category/531421/1 http://blog.csdn.net/zhangqidashu/article/de ...

  4. DEV GridControl 常用属性 z

    1隐藏最上面的GroupPanel gridView1.OptionsView.ShowGroupPanel=false; 2.得到当前选定记录某字段的值 sValue=Table.Rows[grid ...

  5. [置顶] Android 应用内禁止截屏功能的实现

    截图介绍   Android的调试工具DDMS提供有截屏功能,很多软件也会有截屏功能,在做支付等安全类应用的时候,为了保证用户的资产和系统安全,往往会禁止应用内截屏,禁止之后,在此应用处于前台的情况下 ...

  6. 7.【nuxt起步】-Nuxt与后端数据交互

    接下来就是对接服务端接口,展示真实的数据 1.做了个虚拟接口地址:http://test.yms.cn/testjson.asp 输出数据: { "title": "单间 ...

  7. 解决js输出汉字乱码的问题

    近期做安卓开发.安卓client调用server页面,可是server编码为gbk,安卓编码为utf-8.导致js输出内容报错,前期的做法是调整js文件编码.可是会生成两个版本号,非常不方便,最后找到 ...

  8. sdut 面向对象程序设计上机练习九(对象指针)

    面向对象程序设计上机练习九(对象指针) Time Limit: 1000MS Memory limit: 65536K 题目描写叙述 建立对象数组,内放5个学生数据(学号是字符串类型.成绩是整型).设 ...

  9. 从头写一个Cucumber测试(二) Cucumber Test

    转载:https://yaowenjie.github.io/%E7%BC%96%E7%A8%8B%E7%9B%B8%E5%85%B3/cucumber-test-part-2 承接上文   前一篇博 ...

  10. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第11章节--为Office和SP解决方式开发集成Apps Office的JavaScript对象模型

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第11章节--为Office和SP解决方式开发集成Apps  Office的JavaScript对象模型         ...