eclipse中新建jni工程
1.什么是NDK
网上很多不多说,全称是Android Native Developer Kit,是一个工具合集,我理解可以把c/c++打包成.so文件
这是目录结构,要用到指令ndk-build

需要配置环境变量

配置成功在cmd中输入ndk-build会出现如下信息

2.什么JNI
JNI全称是 Java Native Interface,字面意思是java的本地接口,我们知道java是夸平台的,所以java写的程序应该是与平台无关的,
所以在java中如果要调用本地库就需要专门的接口,我可以理解为一套调用机制或者说协议。
进行JNI编程的步骤:
1.java 层:用关键字native声明c/c++方法。导入lib库:
public class Native {
static{
System.loadLibrary("HelloJava");
}
public static native String getString();
}
注意这里"HelloJava"是你新建的c/c++文件名,不要多余写东西。现在我们定义了一个类是Native.java,然后我们要把这个类变成头文件。不过谷歌出的android studio 2.2版本以后可以直接新建一个支撑c/c++工程了。这里不先不提。
首先需要将Native.java编译生成一个.class文件。这里要用的javac。不过你也可以直接运行一下。eclipse会主动帮你编译生成.class,打开cmd

生成的Native.class

这里注意javac的使用我直接cd到了这个类的目录。
生成.class文件之后,再用jdk另外一个工具生成.h文件javah
同样在cmd中:输入javah -help查看使用帮助

[options]是可选项目,<classes>是必须项目。这个就是我们之前生成的Native.class
现在我们要确定需要加载类的路径,还有输出目录。注意每一段之间的空格,容易出错

类的后缀不需要写。执行这个指令完成之后会在当前目录下生成对应的.h文件

在eclipse右键工程名,refresh(f5)以下就会显示出来

至此我们java层的工作完成,接下来就是在Jni中实现所声明的方法。
2.Jni层:
在工程中新建一个jni目录并且将刚才的.h文件移过来

新建一个HelloJava.c的.c源文件在这里我们来实现java层中声明的native方法
#include <stdio.h>
#include <stdlib.h>
#include <jni.h>
JNIEXPORT jstring JNICALL Java_com_example_helloc_Native_getString
(JNIEnv *env, jclass j){
return (**env).NewStringUTF(env,"hello java!");
}
这个函数名字太复杂太扯淡了。其实jni有一个命名规则,我们现在不关心这个,这个函数名可以直接从之前生成的.h文件复制过来
下面就是.h文件的内容
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_helloc_Native */ #ifndef _Included_com_example_helloc_Native
#define _Included_com_example_helloc_Native
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_helloc_Native
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_helloc_Native_getString
(JNIEnv *, jclass); #ifdef __cplusplus
}
#endif
#endif
这里只有函数声明,复制这个声明,我们只要在jni实现函数体就可以了。具体的编程方式这里先不提,这里只是返回了一个字符串
ndk中已经集成了部分c库。完成之后,我们需要将.c变成linux系统能使用的.so库。这个工作就由ndk来完成,具体如下:
ndk-build指令需要在工程目录下执行才有效果,但是并没有规定在什么子目录下,所有效果都是一样的。该指令会将.c或者c++文件生成对应的.so文件,而且是两份,一份在\project path\obj\local\armeabi,这份比较大,包含有调试信息,不会随着app一起发布。另外一份比较小\ project path \libs\armeabi,这个会随着apk一起发布。编译结果

生成了各个平台支持的.so文件完成之后工程目录的libs还没有出现.so文件,
需要右键工程refresh(F5)一下就会出现,这里系统会自动添加"lib"前缀。但是注意在java层导入库的时候不要写"libHelloJava"这个要写:
static{
System.loadLibrary("HelloJava");
}
完成之后执行结果。这是android代码
public class MainActivity extends Activity {
public Button btnShow;
public TextView tvShow;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnShow = (Button)findViewById(R.id.btn_show);
tvShow = (TextView)findViewById(R.id.tv_show);
btnShow.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
tvShow.setText(Native.getString());
}
});
}
}
结果

另外执行ndk-build之前需要先编写.mk文件。具体如下:

在jni中新建一个android.mk文件,内容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) LOCAL_MODULE := HelloJava
LOCAL_SRC_FILES := HelloJava.c
#LOCAL_LDLIBS := -llog -ljnigraphics include $(BUILD_SHARED_LIBRARY)
具体解释如下(借用一为大神的):
LOCAL_PATH := $(call my-dir)
Android.mk 文件首先必须定义好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 := Native
编译的目标对象,LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。
LOCAL_SRC_FILES := Native.c
LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。
注意,默认的C++源码文件的扩展名是’.cpp’. 指定一个不同的扩展名也是可能的,只要定义LOCAL_DEFAULT_CPP_EXTENSION变量,不要忘记开始的小圆点(也就是’.cxx’,而不是’cxx’)
include $(BUILD_SHARED_LIBRARY)
BUILD_SHARED_LIBRARY表示编译生成共享库,是编译系统提供的变量,指向一个GNU Makefile脚本,负责收集自从上次调用'include $(CLEAR_VARS)'以来,定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确地去做。还有 BUILD_STATIC_LIBRARY变量表示生成静态库:lib$(LOCAL_MODULE).a, BUILD_EXECUTABLE 表示生成可执行文件。
eclipse中新建jni工程的更多相关文章
- Eclipse中新建Java工程的三个JRE选项区别
整理自:https://blog.csdn.net/wdjhzw/article/details/42086615 官方解释(链接) Use default JRE: When selected, t ...
- ] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题
] 解决myeclipse中新建javaweb工程,无法使用Web App Libraries问题 标签: myeclipsejavawebWeb App Libraries 2013-10-16 1 ...
- Eclipse中新建WEB项目,JSP页面报错。
在Eclipse中新建java web项目,在JSP页面的第一行提示这个错误: [The superclass "javax.servlet.http.HttpServlet" w ...
- Android Studio新建Jni工程
2.2版本的Android Studio支持新建Jni工程,不用再像以前自己构建工程目录,首先把自己的升级自己的AS到2.2以上 然后打开Tools->Andorid->SDK manag ...
- eclipse中新建maven项目-转
http://huxiaoheihei.iteye.com/blog/1766986 博客分类: maven maven maven是个项目管理工具,集各种功能于一身,下面介绍maven web项目 ...
- Eclipse中Maven WEB工程tomcat调试
最近没事了玩一下maven,使用maven管理工程中的依赖包非常的方便.建立maven web工程的时候开始不知道怎么用tomcat来调试,总是使用mave的tomcat插件发布了后来调试,觉得非常的 ...
- eclipse 中新建文件报错The superclass "javax.servlet.http.HttpServlet" was not found on the Java Buil
在eclipse中新建文件报错错误提示如下: The superclass "javax.servlet.http.HttpServlet" was not found on th ...
- Eclipse中把Java工程修改成web工程
Eclipse中把Java工程修改成web工程 点击项目:右击:选择properties--输入project facets,将“Dynamic Web Module”打勾即可:
- Java web项目搭建系列之一 Eclipse中新建Maven项目
前提条件: 已经安装好JDK 已经安装好Maven 已经安装好Eclipse 已经安装好Maven插件 在Eclipse中新建Maven项目 [File]→[New]→[Other...] [Mave ...
随机推荐
- ios 父VIew的宽度 等于较大view的宽度,并且垂直居中
白色view上面有两个子View,红色view和橙色view.白色view的宽度等于橙色view和红色view宽度较大的一个,并且橙色view和红色view垂直居中, Masonry布局如下: ...
- MVC项目实践,在三层架构下实现SportsStore,从类图看三层架构
在"MVC项目实践,在三层架构下实现SportsStore-02,DbSession层.BLL层"一文的评论中,博友浪花一朵朵建议用类图来理解本项目的三层架构.于是就有了本篇: I ...
- javascript unit testing
http://www.cnblogs.com/Answer1215/p/4230083.html Good http://developer.51cto.com/art/201506/479127.h ...
- php操作Mysql 以及封装常用的函数 用外连接连接3个表的案例
<?php header("content-type;text/html;charset=utf-8"); //数据库连接define('DB_HOST','localhos ...
- bzoj1029 [JSOI2007]建筑抢修
贪心,按截止时间排序,然后按截止时间从小到大枚举维修的建筑,如果之前修理建筑的总时间+当前修理时间<=截止时间,那么答案+1,否则如果之前修理过的建筑中最大的修理时间>当前建筑修理时间,那 ...
- 夺命雷公狗-----React---10--组建嵌套进行数据遍历
先写一个组建... 然后进行嵌套.. <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- vm虚拟机启动失败 Global\vmx86
workstation12 PRO 启动虚拟机异常报错:无法打开内核设备“\\.\Global\vmx86”: 系统找不到指定的文件 解决方法,启动windows系统服务:
- 基于webrtc的资源释放问题(一)
基于webrtc的资源释放问题(一) ——重复释放webrtc的相关资源 背景: 视频通讯大都只是作为一个功能存在于各种应用中,比如微信,qq .既然只是应用的一部分,这样就涉及反复的开启和关闭视频通 ...
- Linux系统软件
ubuntu系统镜像文件: http://pan.baidu.com/s/1jGGgszO 虚拟机: http://pan.baidu.com/s/1hqrhQQg
- [书]WALL·E、龙与地下铁、中国美丽的故事、故事新编、四十自述、书虫、人工智能、大话数据结构
下午有时间,逛了逛了书城,看到了一些书.在这里总结一些自己的感受. 一.<龙与地下铁> 这本书是我首先看到的,就在靠前的新书区.是小说,我没看里面的内容,但是被书封皮的宣传文案 ...