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 随意改变桌面图标的名字
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)