JNI入门
来源:互联网 发布:datagridview查询数据 编辑:程序博客网 时间:2024/05/06 22:57
首先声明一点,Eclipse不仅仅适合于开发Java应用程序。Eclilpse为Java开发提供了极好的支持,它的设计初衷也是为了Java。但得益于它的设计架构,Eclipse能够为包括C语言在内的任何语言的开发提供支持。一个名为CDT的插件,使得在Eclipse里能对C/C++进行开发。
首先说明几个概念
NDK(Native Development Kit)是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。
JNI(Java Native Interface)它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。
接下来我将来展示一下一个简单的JNI开发
1.配置NDK环境
(这里使用最新ndk,以前做Android的项目要用到NDK就必须要下载NDK,安装Cygwin(模拟Linux环境用的),下载CDT(Eclipse C/C++开发插件),还要配置编译器,环境变量,特别麻烦,新版就不需要了)
下载用于开发Android NDK的插件,ADT版本在20以上,就能安装NDK插件,另外NDK集成了CDT插件。地址:http://pan.baidu.com/s/1bKvDjK
下载后放到eclipse目录的plugins目录下,重启eclipse,点击Window->Preferences->Android->NDK,设置NDK路径
ndk自己可以去官网下,这里附上我的ndk包(http://pan.baidu.com/s/1jH5SlaY)
2.生成so文件
(一)新建一个Android工程(NDKBuild)
在工程上右键点击Android Tools->Add Native Support…,
然后给我们的.so文件取个名字,例如:NDKBuild(我用默认的)
目录结构如
其中Android.mk文件中”LOCAL_MODULE:=NDKBuild”这个变量很有用
(二)编写java文件,使用native方法
public class Print { static { System.loadLibrary("NDKBuild"); } public native String printHello();}
其中,loadLibrary中的参数就是LOCAL_MODULE的值
(三)编写jni
进入bin/classes目录下,使用javah命令生成头文件
首先,路径不要搞错,是bin/classes目录。其次”javah -jni com.example.ndkbuild.Print”最后的参数是”包名+类名”
这样,在bin/classes目录下就有com_example_ndkbuild_Print.h头文件,把它放到jni文件夹下打开
然后将头文件自动生成的方法名copy到NDKBuild.cpp中,注意加上形参
#include <jni.h>#include <string.h>#include "com_example_ndkbuild_Print.h"JNIEXPORT jstring JNICALL Java_com_example_ndkbuild_Print_printHello( JNIEnv *env, jobject j) { return env->NewStringUTF("hello");}
此时如果不确定是否有错,可以run as Android Application。如果有错,Console会报错
此时的文件目录:
3.加载so并使用
在MainActivity.java添加如下代码:
public class MainActivity extends Activity { static { System.loadLibrary("NDKBuild"); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Print print = new Print(); Log.i("Print", print.printHello()); }}
后台会打印hello的。
- JNI入门
- JNI入门
- JNI入门
- JNI入门
- JNI 入门
- JNI入门
- JNI入门
- JNI入门
- JNI入门
- jni入门
- JNI入门
- JNI入门
- JNI入门
- JNI入门
- JNI入门
- jni入门
- JNI 入门
- JNI入门
- ios本地搭建IPv6测试环境
- 在控制台中显示Hibernate打印的SQL中的参数
- 【Android基础知识】ContentProvider(三)使用ContentResolve查询和修改通讯录
- C++实验七-最大公约数
- 关于nodejs邮件群发的Nodemailer
- JNI入门
- C++第七次上机作业
- SPOJ COT (主席树 LCA)
- seajs配置
- 14.2.5.6 Adaptive Hash Indexes 自适应Hash Indexes
- 使用React.js 重新构建HipChat
- java中join,yield的用法
- 安装DirectX SDK报错s1023的解决
- hadoop2.6.0 + Azkaban2.5.0 任务调度系统实践