如何在android源码中添加自己的jni方法

如何在android源码中添加自己的jni方法,第1张

1,、 项目实现了一个简单的四则运算,项目的目录层次如下:

AndroidManifest.xml Android.mk jni res src

资源文件简简单单,一个布局文件,稍后会有demo的下载地址

主要记录备忘的内容如下:

MainActivity.Java

[html] view plain copypublic native int add(int x, int y)

public native int substraction(int x, int y)

public native float multiplication(int x, int y)

public native float division(int x, int y)

static{

System.loadLibrary("arithmetic")

}

2、生成lib的名称为libarithmetic.so.注意load的时候写"arithmetic"

jni 目录下有两个文件,一个是Android.mk,一个是c++源文件long.cpp

jni/Android.mk如下:

[html] view plain copyLOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_MODULE:= libarithmetic

LOCAL_SRC_FILES:= \

long.cpp

LOCAL_SHARED_LIBRARIES := \

libutils

LOCAL_STATIC_LIBRARIES :=

LOCAL_C_INCLUDES += \

$(JNI_H_INCLUDE)

LOCAL_CFLAGS +=

LOCAL_PRELINK_MODULE := false

include $(BUILD_SHARED_LIBRARY)

3、 注释:

LOCAL_PATH(必须定义,而且要第一个定义),宏函数‘my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk

file文件的目录)

include $( CLEAR_VARS),

CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE,

LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH

。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的

LOCAL_MODULE_TAGS :=user eng tests optional

user: 指该模块只在user版本下才编译

eng: 指该模块只在eng版本下才编译

tests: 指该模块只在tests版本下才编译

optional:指该模块在所有版本下都编译

LOCAL_MODULE(必须定义),标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。Note:编译系统会自动产生合适的前缀和后缀,例如:arithmetic编译成功后将生成libarithmetic.so库文件

LOCAL_SRC_FILES 变量必须包含将要编译打包进模块中源代码文件。不用在这里列出头文件和包含文件。

LOCAL_SHARED_LIBRARIES中加入所需要链接的动态库(*.so)的名称

LOCAL_STATIC_LIBRARIES加入所需要链接的静态库(*.a)的名称

LOCAL_CFLAG可选的编译器选项,用法之一是定义宏,例如LOCAL_CFLAGS := -Werror作用是编译警告也作为错误信息

LOCAL_PRELINK_MODULE:=false,不作prelink处理,默认是要prelink *** 作的,有可能造成地址空间冲突(这地方目前还不明白)

long.cpp源代码如下:

[html] view plain copy#define LOG_TAG "LongTest2 long.cpp"

#include

#include

#include "jni.h"

jint add(JNIEnv *env, jobject thiz, jint x, jint y){

return x + y

}

jint substraction(JNIEnv *env, jobject thiz, jint x, jint y){

return x - y

}

jfloat multiplication(JNIEnv *env, jobject thiz, jint x, jint y){

return (float)x * (float)y

}

jfloat division(JNIEnv *env, jobject thiz, jint x, jint y){

return (float)x/(float)y

}

static const char *classPathName = "com/inspur/test2/MainActivity"

static JNINativeMethod methods[]= {

{"add", "(II)I", (void*)add},

{"substraction", "(II)I", (void*)substraction},

{"multiplication", "(II)F", (void*)multiplication},

{"division", "(II)F", (void*)division},

}

typedef union{

JNIEnv* env

void* venv

}UnionJNIEnvToVoid

static int registerNativeMethods(JNIEnv* env, const char* className,

JNINativeMethod* gMethods, int numMethods){

jclass clazz

clazz = env->FindClass(className)

if (clazz == NULL)

return JNI_FALSE

if (env->RegisterNatives(clazz, gMethods, numMethods)<0)

return JNI_FALSE

return JNI_TRUE

}

static int registerNatives(JNIEnv *env){

if (!registerNativeMethods(env, classPathName,

methods, sizeof(methods)/sizeof(methods[0])))

{

return JNI_FALSE

}

return JNI_TRUE

}

jint JNI_OnLoad(JavaVM* vm, void* reserved){

UnionJNIEnvToVoid uenv

uenv.venv = NULL

jint result = -1

JNIEnv *env = NULL

if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK){

goto bail

}

env = uenv.env

env = uenv.env

if (registerNatives(env) != JNI_TRUE){

goto bail

}

result = JNI_VERSION_1_4

bail:

return result

}

除了利用 编写native JAVA类,通过javah生成.h文件,根据.h文件编写.c/cpp文件

方法外(名字像老太太的裹脚步,又臭又长,而且不灵活),Android还可以通过引用JNI_Onload方式实现。jint JNI_onLoad(JavaVM*

vm, void* reverced),改方法在so文件被加载时调用。

JNI_OnLoad()有两个重要的作用:

指定JNI版本:告诉VM该组件使用那一个JNI版本(若未提供JNI_OnLoad()函数,VM会默认该使用最老的JNI

1.1版),如果要使用新版本的JNI,例如JNI

1.4版,则必须由JNI_OnLoad()函数返回常量JNI_VERSION_1_4(该常量定义在jni.h中) 来告知VM。

初始化设定,当VM执行到System.loadLibrary()函数时,会立即先呼叫JNI_OnLoad()方法,因此在该方法中进行各种资源的初始化 *** 作最为恰当。

JNI_OnUnload()的作用与JNI_OnLoad()对应,当VM释放JNI组件时会呼叫它,因此在该方法中进行善后清理,资源释放的动作最为合适。

4、 项目根目录下Android.mk文件:

[html] view plain copyLOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := optional

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_JNI_SHARED_LIBRARIES := libarithmetic

LOCAL_PACKAGE_NAME := LongTest

LOCAL_SHARED_LIBRARIES := \

libutils\

liblog

include $(BUILD_PACKAGE)

include $(LOCAL_PATH)/jni/Android.mk

# Also build all of the sub-targets under this one: the.shared library.

include $(call all-makefiles-under,$(LOCAL_PATH))

LOCAL_PACKAGE_NAME:项目名称,即最终生成apk的名字

LOCAL_JNI_SHARED_LIBRARIES := libxxx就是把so文件放到apk文件里的libs/armeabi里

执行BUILD_PACKAGE。它的定义也是在config.mk中定义如下:BUILD_PACKAGE:=

$(BUILD_SYSTEM)/package.mk

$(call all-java-files-under, src)编译的源代码文件列表添加src目录下所有的java 源文件

$(call all-makefiles-under, $(LOCAL_PATH))编译器会在编译完当前目录下的文件后再深入子目录编译

如果make过android源码,可以在项目根目录下执行mm命令进行编译。前提是执行过source

androidSRC/build/envsetup.sh

或者直接把source androidSRC/build/envsetup.sh添加到~/.bashrc中,会更加方便

CYDIA 有个管理 添加源就可以了 源有很多,看你喜欢了,可以百度cydia源 看你喜欢。还可以直接搜索

1 Zeppelin 用图片快速替换系统运营商名称

2 OpenNotifier 在状态栏提示新的通知图标

3 Action Menu 给文字编辑状态下的菜单增加更多选项

4 MultiIconMover 一次性移动多个图标,使整理更快捷

5 Double@ 双击@键,直接粘贴邮箱地址

6 Pull to Dismiss 下拉隐藏键盘

7 Ipsum 在锁屏快速忽略新消息

8 DeleteAllSMS 一键删除所有信息

9 TapdeWiggle 点击桌面空白地方退出图标编辑模式

0 SwipeShiftCaret 滑动屏幕移动光标

10 Inlinecandidate 把iOS5键盘还原为iOS4键盘

11 BackforwardEnhsncer 长按后退浏览本网页全部历史

12 Winterboard 改变界面主题

13 BytaFont 修改字体的神器

14 CleanStatus 选择性的关闭状态栏图标

15 Slider Enhancer 滑动解锁框内容修改插件

16 BlurriedNCBackground 让通知中心背景变为磨砂效果

17 Custom NoNewslabel 改变通知中心无新消息时的文字

18 WeatherIcon 在状态栏显示添加天气图标和温度

19 Tab+ 取消safari8页的限制

20 arrangestatusbars 自由布置你的状态栏

21 NO LSB 充电时不显示电池图标并且显示锁屏壁纸

22 NCColors 通知中心背景透明换颜色加磨砂效果

23 badgeclear 清除所有桌面角标

24 Nonewsisgoodnews 干掉iOS5的newsstsnd

25 No Uninstall 隐藏删除软件时的X防止误删

26 AnyLockApp 锁屏相机改为任何软件

27 AccountChanger 快速切换appleID

28 Custom NC Background 自定义通知中心背景

29 Lorem 通过拖拽快速忽略通知中心消息

30 NewTabSearch 在safari浏览器搜索时开启新界面

31 FolderIcons iOS文件夹美化

32 SpotRemover 取消搜索页面保留回d效果

33 Pull To Refresh Safari 下拉刷新网页

34 Pull To Refresh Mail 下拉刷新邮件

35 StatusBarCustomClock4 自定义状态栏

36 PictoKeyboard 添加一个符号键盘

37 LowPowerBanner 低电量d出窗变为通知中心的Banner显示

38 Plugication 播放音乐拔掉耳机后暂停

39 Lunar Calender for NC 通知中心显示农历

40 SwitcherLand 后台可以横屏显示

41 ClearLockNotifications 一键清除多个锁屏消息

42 PodControl 桌面增加控制ipod的按钮

43 VUZIQ 在线下载MV作为来电铃声

44 Spire 为iPhone4搭建Siri平台

45 NCSettings 在通知中心增加快捷按钮

46 KillBackground 一键关闭后台软件

47 vUnlock 用音量键解锁屏幕

48 Stay Opened 在手机下载app的时候不会退回主界面

49 PasswordPilot 下载App时自动填写appleID的密码

50 Icon Renamer 随意改变桌面图标的名字


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11380341.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存