首页 > 其他分享 >android 之ndk开发

android 之ndk开发

时间:2022-11-29 14:37:09浏览次数:59  
标签:NDK java ndk HelloWorld 目录 开发 android Android


1、Android NDK简介

NDK全称为native development kit本地语言(C&C++)开发包。而对应的是经常接触的Android-SDK,(software development kit)软件开发包(只支持java语言开发)。

简单来说利用NDK,可以开发纯C&C++的代码,然后编译成库,让利用Android-SDK开发的Java程序调用。NDK开发的可以称之为底层开发或者jni(java  native interface)层开发,SDK开发可以称为上层开发。


2、为何要用NDK


2.1、众所周知,利用SDK编写的代码,生成的APK,很容易就可以反编译了,安全性极为不高,而利用NDK开发的库,不容易被反编译,保密性,安全性都提高了。

2.2、很多开源工程和大型工程都是C&C++代码,把它们转换为纯java语言显然是不可能的。

2.3、C&C++的代码运行速度和效率都比java快很多。


3、NDK环境的搭建

在​​http://developer.android.com/sdk/ndk/index.html​​下载最新版的NDK,然后解压到你喜欢的位置,然后把NDK的所在的目录,配置到环境变量里面就行。

如我在windows下面用cygwin开发


简单来说就是在linux或者cygwin的安装目录,跳转到/home/YourName/,然后编辑.bash_profile文件,在末尾添加如下语句,具体根据自己的情况而定。


[java] ​​ view plain​​ ​​copy​​



  1. ndk=/home/conowen/android-ndk-r7b  
  2.   
  3. export ndk  



4、新建一个NDK工程

新建一个目录,命名为HelloWorld,然后在里面新建一个名为jni的目录(名称一定要是jni,因为ndk-build的时候会在HelloWorld目录下寻找jni的目录,然后进行build),在jni目录下新建如下文件HelloWorld.c和Android.mk。

HelloWorld.c文件代码如下(此JNI是没有jni_onLoad函数的)


[java] ​​ view plain​​ ​​copy​​



  1. #include <string.h>  
  2. #include <jni.h>  
  3.   
  4. jstring  
  5. Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI( JNIEnv* env,  
  6.                                                   jobject thiz )  
  7. {  
  8. return (*env)->NewStringUTF(env, "HelloWorld! I am from JNI !");  
  9. }  
  10.   
  11.   
  12.   
  13.   
  14. /*注意,这里

  15. jstring 表示返回值

  16. Java_com_conowen_helloworld_HelloWorldActivity_helloWorldFromJNI

  17. 写法是Java+Android工程的包名+Android工程的Activity名+方法名,点号用下划线表示,这个写法很严格。
  18. 包名:com_conowen_helloworld
  19. Activity名:HelloWorldActivity
  20. 方法名:helloWorldFromJNI

  21. JNIEnv* env, jobject thiz是Native方法自带的参数,可以用来转换一个数据类型。也就是说其实这个helloWorldFromJNI是没有形参的。
  22. */



Android.mk代码如下

关于Android.mk的编写格式,下一篇博文补全


[java] ​​ view plain​​ ​​copy​​



  1. LOCAL_PATH := $(call my-dir)  
  2.   
  3. include $(CLEAR_VARS)  
  4. #LOCAL_MODULE表示生成的库的名字,前面的lib和后缀名不用写  
  5. LOCAL_MODULE    := HelloWorld  
  6. LOCAL_SRC_FILES := HelloWorld.c  
  7.   
  8. include $(BUILD_SHARED_LIBRARY)  


然后在终端里面,转到HelloWorld目录下,执行


[java] ​​ view plain​​ ​​copy​​



  1. $ndk/ndk-build  

$ndk是之前配置的NDK环境变量。编译成功后,会在在目录生成libs和obj两个文件夹,libs里面有刚刚编译成的libHelloWorld.so库。


5、新建一个Android工程

在eclipse里面新建一个Android工程,java代码如下,然后把刚刚生成的libs文件夹拖到Android工程目录下。


[java] ​​ view plain​​ ​​copy​​



  1. package
  2.   
  3. import
  4. import
  5. import
  6.   
  7. public class HelloWorldActivity extends
  8. /** Called when the activity is first created. */
  9. @Override
  10. public void
  11. super.onCreate(savedInstanceState);  
  12.   
  13. new TextView(this);  
  14.         tv.setText(helloWorldFromJNI());  
  15.         setContentView(tv);  
  16.     }  
  17.   
  18. public native String helloWorldFromJNI();// native声明,表示这个方法来自Native层。实现过程已经在native层实现了
  19.   
  20. static
  21. "HelloWorld");// 加载库,前面的lib和,后缀名不用写
  22.     }  
  23. }  



效果图:

android 之ndk开发_java

标签:NDK,java,ndk,HelloWorld,目录,开发,android,Android
From: https://blog.51cto.com/u_13657808/5894968

相关文章

  • android之service
    android中服务是运行在后台的东西,级别与activity差不多。既然说service是运行在后台的服务,那么它就是不可见的,没有界面的东西。你可以启动一个服务Service来播放音乐,或者记......
  • android代码混淆
    proguard原理Java代码编译成二进制class文件,这个class文件也可以反编译成源代码,除了注释外,原来的code基本都可以看到。为了防止重要code被泄......
  • 应用 Serverless 化,让业务开发心无旁骛
    我们希望让用户做得更少而收获更多,通过Serverless化,用云就像用电一样简单。”张建锋表示,Serverless让云计算从一种资源真正变成一种能力,未来云将全面Serverless化,更加......
  • 开发申请单——流程表单有转交时确保开发人组件值随着转交人变化而变化
    参考宜搭平台接口:https://www.yuque.com/yida/support/aql605说明:只写了一个方法 getProcessData,有页面自动调用函数didMount调用(当前页面-设置-生命周期-页面加载......
  • SpringBoot 实际项目开发中工厂模式的巧妙使用
    简单工厂模式:     简单工厂模式是创建型模式,创建型模式顾名思义,也就是说在创建对象的时候,遇到了瓶颈才会选择的设计模式。那么该什么情况使用呢。  简单工厂模式......
  • 设计模式在实际开发中的应用
    我相信有些人学了设计模式,依然不知道设计模式的应用场景,感觉我们日常开发中,仅仅写些逻辑,调下接口,连接下数据库就完事儿了。感觉设计模式都被框架运用的淋淋尽致,似乎没有我们......
  • ShareSDK Android端权限说明
    ShareSDK使用权限情况权限权限说明是否必须INTERNET允许应用程序联网必须ACCESS_NETWORK_STATE允许访问网络状态必须READ_PHONE_STATE读取设备标识非必须WRITE_EXTERNAL_STO......
  • 解决程序开发过程中的 cannot open shared object file 问题
    解决程序开发过程中的cannotopensharedobjectfile问题目录解决程序开发过程中的cannotopensharedobjectfile问题问题描述问题分析问题解决参考文献问题描述......
  • 史上最全的android学习资料
    一、开发环境搭建(已完成)负责人:kris状态:已完成所整理标签为:搭建SDKJDKNDKEclipseADT模拟器AVD调试器(DEBUG)DDMS测试日志LogcatA......
  • 【React】653- 22 个让 React 开发更高效更有趣的工具
    英文 | https://dev.to/jsmanifest/22-miraculous-tools-for-react-developers-in-2019-4i46​众所周知,React是JavaScript库,用于构建出色的用户界面。但是,并不是每个人......