1.JNI到底是码开啥
2.å®åjniå¼åï¼
3.Android开发中的NDK到底是什么?(详细解析+案例)
JNI到底是啥
JNI,全称为Java Native Interface,码开是码开Java的本地接口,旨在提供Java与本地代码之间的码开桥梁。在Java的码开开发过程中,我们经常能听到它的码开上传源码工具名字,但却很少有人对其有深入的码开了解。
在日常的码开Java开发中,我们常常提到Java的码开跨平台和可移植性,但有时候平台特有的码开功能在Java中实现起来就显得不够便利。此时,码开JNI就显得尤为重要。码开它允许开发者在Java中调用本地代码,码开以实现对特定平台特有功能的码开访问。
JNI中的码开“native”修饰的方法,实际上就是我们经常在Java源码中遇到的“native”方法。这类方法没有具体实现,只是提供一个接口,等待本地代码进行实现。nanomsg源码剖析例如,Object类中的hashCode方法,就是一个典型的native方法,它为我们提供了计算对象哈希值的基础。
那么,JNI是如何实现这个功能的呢?答案是通过C或C++语言来实现。JNI的实现方法与Java方法栈不同,它对应的是本地方法栈,这里包含了针对特定平台的德尔塔周期源码一些C实现的方法。
JVM是如何将这些本地方法加载到本地方法栈中的呢?这就是JNI的核心所在。JNI的实现分为“主动型”和“被动型”两种。
在主动型中,JVM会根据native方法去寻找对应的C语言实现。JVM会按照一定的命名规则来查找,确保Java与C语言之间的兼容性。
查找规则通常遵循Java_开头,后面跟着包名和方法名的格式。例如,行为分析源码一个名为Java_com_example_MyClass的方法,其对应的C函数可能为Java_com_example_MyClass_方法名。
被动型则更为灵活,它依赖于一个主动型的C函数方法实现。在这种情况下,JVM在加载时会先加载一个名为registerNatives的方法,该方法位于类的静态块中,将其中的native方法加载进来,即使它们没有遵循命名规则。json轮训源码
对于JNI的API,Oracle提供了一份详细的文档,但未进行与其他版本如OpenJDK的比较。JNI也涉及垃圾回收,生成的对象通常不会轻易被回收,但在本地方法返回后,局部引用的对象会被标记为可回收,为垃圾回收提供线索。
å®åjniå¼åï¼
å¦ä½ç¼åå®å软件
1ãè§ææ2é1å®åçæ¬ï¼åå¼å§ä¹ä¸ç¥ééé¢æäºä»ä¹ææ¯é¾åº¦ï¼ä½æ¯è¦åçç®æ å·²ç»æç¡®äºï¼èä¸ä¹æ²¡æç°æçï¼ç¢°å°é®é¢å°±æ¥èµæï¼æ ¢æ ¢å°è§£å³ï¼è¿æ ·æçæ¾ç¢ï¼å¦ä¹ çææé常好ã
2ãä¸é¢æå°±å¼å§ä»ç»æ们å¼åéè¦ç¨ç软件ï¼Xcode(软件ä¸è½½å°åï¼developer.apple/xcode/)ï¼IOS模æå¨ã
3ãéæ±åæãç¡®å®è¦å¼åæä¸æ¬¾è½¯ä»¶çåæ¶è¦å¯¹éæ±è¿è¡åæï¼å¼åçappæå®é å®ç¨æä¹æå¯ä»¥ãå¼åè éè¦å¯¹è½¯ä»¶ç³»ç»è¿è¡æ¦è¦è®¾è®¡ï¼å³ç³»ç»è®¾è®¡ã
4ãè°·ææ¨åºçAppInventorAndroidAppå¼åå·¥å ·å¯ä»¥è®©ä½ ä» éè¿ææå¼çç®åæä½å°±å¯ä»¥å建èªå·±çAndroidAppã对äºé£äºä¸ºäºç¹å®ç®çæ³è¦å¨æå°è¯å¼åä¸ä¸ªç®ååºç¨çç¨æ·ã
5ãEclipseADTEclipseADTæ¯Eclipseå¹³å°ä¸ç¨æ¥å¼åAndroidåºç¨ç¨åºçæ件TheSDKandAVDManagerè¯¥å·¥å ·å å«å¾å¤éè¦çåè½ï¼å æ¬ç®¡çä¸åçAndroidSDKçæ¬ï¼æ建ç®æ ï¼ï¼Androidççæ¬ä¼å¤ï¼APIä¸æäºå ¼å®¹æ§é®é¢ã
6ãä¸é¢ï¼ä¸ç§è±æ就为大家æ®åä¸ä¸å®å软件å¼åå ¥é¨ç¥è¯ãå级é¶æ®µè¦å¦ä¹ çå 容é ç½®ç¯å¢ï¼å ¨é¨éç¨åæ°çæ¬SDKãADTãECLIPSEãJDKãç¼åæè è¿è¡æå¦ç¤ºä¾è¿æ¶é´ä¸»è¦è¿è¡ç示ä¾å¦HELLOWORLDï¼è¿æSDK带çä¾åã
Androidä¸æä¹éè¿JNIç¼ç¨å»åéadbæ令æ§å¶ææºç¼åä¸ä¸ªCç¨åºï¼ä½¿ç¨system(âcmdline)ï¼ç´æ¥è°ç¨å½ä»¤è¡ç¨åºå³å¯ã
(constchar*)(*env)-GetStringUTFChars(envï¼inputStrï¼JNI_FALSE)ï¼LOGI(dufresne---%sï¼(constchar*)str)ï¼//éç¥èææºæ¬å°ä»£ç ä¸åéè¦éè¿str访é®Javaå符串ã
$cd~/project/Android/JNITest/bin$cd~/project/Android/JNITest/binæ们ç¨lså½ä»¤æ¥çï¼å¯ä»¥çå°binç®å½ä¸æ个classesç®å½ï¼å ¶ç®å½ç»æ为classes/org/tonny/jniï¼å³classesçåç®å½ç»ææ¯androidå·¥ç¨çå åorg.tonny.jniã
å¦ä½ç¨javaè¿è¡å®ååºç¨çå¼åç´æ¥ç¾åº¦æç´¢å®åå¼åæç¨ï¼èµæºé常å¤ãå å»æJavaåCå¦å¥½å说ã
æ¯çï¼Javaå¯ä»¥ç¨äºå¼åå®ååºç¨ãå®ååºç¨çå¼åå¯ä»¥ä½¿ç¨Javaç¼ç¨è¯è¨åAndroidSDKï¼è½¯ä»¶å¼åå·¥å ·å ï¼ãè³äºâå®åæ¯å¦ä¼ä¸è½½å± æ°âï¼æä¸å¤ªæç½æ¨çææã
第ä¸æ¥ï¼å®è£ jdkï¼é ç½®jdkç¯å¢ãç¾åº¦æjdké 置第äºæ¥ï¼å®è£ AndroidStudio+SDKãæè Eclipse+ADT+AndroidSDKã第ä¸æ¥ï¼éè¦Androidæºåæè å®è£ èææºãå¦æçé®ï¼è¯·æåºã
ä¸ï¼JavaSEç¼ç¨Javaæ¯ä¸ç§é¢å对象çå¼åè¯è¨ï¼Androidæä½ç³»ç»çåºç¨å±ä½¿ç¨Javaè¯è¨æ¥å¼åï¼æ以è¦æ³è¿è¡Androidå¼åå¿ é¡»æè¯å¥½çJavaåºç¡ã
Androidåºç¨ç¨åºå¼åæ¯ä»¥Javaè¯è¨ä¸ºåºç¡çï¼æ以éè¦ææå®çJavaåºç¡ç¥è¯ãé¦å çæjavaåºæ¬è¯æ³ï¼ç¶åçæ设计模å¼çã
ç¨jniåçå®ååºç¨è½è¢«åç¼è¯å
å°ç¨åºè½¬æ¢ææ¬å°ä»£ç ä¹æ¯ä¸ç§é²æ¢åç¼è¯çæææ¹æ³ãå 为æ¬å°ä»£ç å¾å¾é¾ä»¥è¢«åç¼è¯ãå¼å人åå¯ä»¥éæ©å°æ´ä¸ªåºç¨ç¨åºè½¬æ¢ææ¬å°ä»£ç ï¼ä¹å¯ä»¥éæ©å ³é®æ¨¡å转æ¢ã
æå ç§æ¹å¼æ¥æé«è¢«åç¼è¯å代ç çé¾åº¦ï¼1å ³é®ä»£ç 使ç¨jniè°ç¨æ¬å°ä»£ç ï¼ç¨cæè c++ç¼åï¼å æ¤ç¸å¯¹æ¯è¾é¾äºåç¼è¯2æ··æ·java代ç ãæ··æ·æ¯ä¸æ¹å代ç é»è¾çæ åµä¸ï¼å¢å æ ç¨ä»£ç ï¼æè éå½åï¼ä½¿åç¼è¯åçæºä»£ç é¾äºçæã
ç±äºapkæ¯Androidèææºå è½½çï¼å®æä¸å®çè§èï¼å å¯apkåDalvikæ æ³è¯å«apkäºãå®å ¨é¿å æ¯ä¸å¯è½çï¼æ»æ人è½å¤ç ´è§£åç代ç ãä½æ¯æå ç§æ¹å¼æ¥æé«è¢«åç¼è¯å代ç çé¾åº¦ã
å¦ä½JAVA代ç è°ç¨ï¼jniå§ï¼å®åçSOæ件æ¯linuxä¸çæ件ï¼ç¨cæè c++åçã
ä¸é¢è¯´äºï¼è¿ç§æ¹å¼å ¶å®å¹¶ä¸æ¯çæ£å å¯ä»£ç ï¼å ¶å®ä»£ç è¿æ¯è½å¤è¢«äººåç¼è¯(æ人å¯è½è¯´ï¼ä½¿ç¨proguardä¸çoptimizeé项ï¼å¯ä»¥ä»åèæµå±é¢æ´æ¹ä»£ç ï¼çè³å¯ä»¥è®©JDè¿äºåç¼è¯è½¯ä»¶å¯ä»¥æ æ³å¾å°å 容ã
Androidä¸JNIæ¯ç¼è¯soåºçæºä»£ç ï¼ç¼è¯æååä¼çæSOåºï¼androidä¸æç»æ¯ä½¿ç¨SOåºçã
å®åå¼åè°ç¨åºå±ç¡¬ä»¶æä½æ¹æ³å¦ä¸ï¼ç¼è¯åå®è£ 该çæçapkå³å¯ä½¿ç¨è¯¥ç¨åºè°ç¨åºå±ç¡¬ä»¶é©±å¨ã大æ¦æ´ä¸ªè¿ç¨å°±è¿æ ·ï¼ä¸å±appè°ç¨æ¡æ¶å±çjavaæ¥å£ï¼javaæ¥å£éè¿jniè°ç¨ç¡¬ä»¶æ½è±¡å±å³å¯ã
ï¼Androidåºç¨ç¨åºå±ï¼2ï¼åºç¨ç¨åºæ¡æ¶å±ï¼3ï¼ç³»ç»è¿è¡åºå±ï¼4ï¼Linuxæ ¸å¿å±ã
å¯ä»¥åèä¸ä¸/luoshengyang/article/details/ãéé¢çåæä»ä¸å°å ï¼å®æ´çæè¿°çåºå±å°åºç¨å±çè°ç¨ï¼å¯¹äºç解HALæå¾å¤§ç帮å©ã
Androidåºå±é©±å¨ï¼ä»¥åæä½ç³»ç»å ¨é¨å æ ¸é½æ¯ä½¿ç¨Cè¯è¨åæ±ç¼è¯è¨ç¼ç¨å¼åãä½æ¯androidæä½ç³»ç»æ¬èº«æ¯ä½¿ç¨Javaå¼åï¼ä½¿ç¨JNIè°ç¨æ¬å°çCè¯è¨åºï¼ç±æä½ç³»ç»å®ç°å¯¹åºå±è°ç¨ãiOSç³»ç»æ¯è¹æèªå·±å¼åçï¼æ ¸å¿åéCè¯è¨ã
第åå±ï¼åºäºCçNDK(NativeDevelopmentKit)ï¼å¾å¤å¤§å游ææ¯ç¨è¿ç§æ¹æ³å¼åçï¼ç¸å¯¹äºJDKï¼è¿ç§æ¹æ³çé¨æ§å°±æ´é«äºï¼ç®å使ç¨çæ¯è¾å°ï¼æ¯ç«ç°å¨æ¯æºè½ææºçæ¶ä»£ï¼ç¡¬ä»¶åç½éé½å¤§å¹ æåï¼æ²¡å¿ è¦å¨ä¸å¨å°±Touchåºå±ã
AndroidNDKå¼åç®ä»NDKåSDK以åJNIæä»ä¹å ³ç³»_å®åndkæ¯å¹²åç_ç¾åº¦...对äºandroidç³»ç»çä¸äºå¼åçæ¬ç管ç以å模æå¨ç®¡çãèndkï¼NativeDevelopmentKitï¼è·sdkå·®ä¸å¤çæ¯ä»ä¹æ¯ä¸ä¸ªå¼åå·¥å ·å ãç¨ä»å¼åc/c++æ¯å¾æ¹ä¾¿çãä»æä¸ä¸ªå¼ºå¤§çç¼è¯éåãå ¶å®åè¯ç解éæä¹ä¸æ³å¤è¯´ã
NDKæ¯ç¨æ¥ç»å®åææºå¼å软件ç¨çï¼ä½æ¯åSDKä¸åçæ¯å®ç¨çæ¯Cè¯è¨ï¼èSDKç¨çæ¯Javaè¯è¨ãNDKæ¯ä¸ç³»åå·¥å ·çéåï¼NDKæä¾äºä¸ç³»åçå·¥å ·ï¼å¸®å©å¼åè å¿«éå¼åCï¼æC++ï¼çå¨æåºï¼å¹¶è½èªå¨å°soåjavaåºç¨ä¸èµ·æå æapkã
NDKæ¯ç¨æ¥ç»å®åææºå¼å软件ç¨çï¼ä½æ¯åSDKä¸åçæ¯å®ç¨çæ¯Cè¯è¨ï¼èSDKç¨çæ¯Javaè¯è¨ã
JNI表示JavaNativeIntefaceï¼æ¯Javaä¸å®ä¹çä¸ç§ç¨äºè¿æ¥JavaåC/C++æ¥å£çä¸ç§å®ç°æ¹å¼ãNDK表示NativeDevelopmentKitï¼æ¯Googleå¨Androidå¼åä¸æä¾çä¸å¥ç¨äºå¿«éå建nativeå·¥ç¨çä¸ä¸ªå·¥å ·ã
Android开发中的NDK到底是什么?(详细解析+案例)
在Android开发中,Native Development Kit (NDK)扮演着关键角色,它是一个用于快速开发C和C++动态库的工具包。NDK的主要目标是将编译后的.so文件与应用一起打包成APK,尤其适合需要JNI(Java Native Interface)技术的场景。 NDK使用步骤如下:首先,配置Android NDK环境。这包括下载并解压NDK工具包到指定路径,如:/Users/Carson_Ho/Library/Android/sdk/ndk-bundle。Android Studio会自动检测并集成,无需额外手动关联。
关联项目与NDK:在Gradle配置文件中添加必要的配置,包括local.properties、gradle.properties和build.gradle中的ndk节点,确保项目每次都能正确使用NDK。
创建本地C++代码文件,如test.cpp。注意文件命名规则,确保Java和C++接口的兼容性。
接着,编写Android.mk和Application.mk文件,分别指定源码编译配置和平台相关配置,放在jni文件夹中。
执行编译命令,生成.so库文件,一般会在src/main/jniLibs目录下找到。
在MainActivity.java和对应的布局文件中,集成并调用NDK编写的C++代码。
对于Android Studio 2.2及以上版本,NDK的集成更为方便,只需在创建工程时按照提示配置即可,无需额外安装和配置。