七、Android学习笔记_JNI hello world
1、需要准备的工具,eclipse,cdt(c++)插件,cygwin(unix)和 android ndk.
在cygwin的etc目录下将ndk的路径引入到profile文件中,可以在cygwin的任何目录都可以访问到ndk,不同的ndk路径PATH的写法不同.
: ${ORIGINAL_PATH=${PATH}}
if [ ${CYGWIN_NOWINPATH-addwinpath} = "addwinpath" ] ; then
PATH="/usr/local/bin:/cygdrive/d/cgwin/android-ndk-r7b:/usr/bin${PATH:+:${PATH}}"
else
PATH="/usr/local/bin:/usr/bin:/cygdrive/d/cgwin/android-ndk-r7b"
fi
2、开发步骤:
a.创建一个android工程
b.JAVA代码中写声明 native 方法 public native String helloFromJNI(); 通过javah 包名.类名生成jni的方法签名
c. 创建jni目录,编写c代码,方法名字要对应。或者将生成的签名文件拷贝到jni目录,然后在c代码中引入。
d.编写Android.mk文件
e.Ndk编译生成动态库( ndk -build )
f.Java代码load 动态库.调用native代码
2.1 创建一个Android项目,创建native方法.

public class MainActivity extends Activity {
static{
//加载二进制文件
System.loadLibrary("Hello");//libHello.so 去掉lib和so
}
public native String helloFormC();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.out.println("------------"+helloFormC());
}
}

2.2 javah命令成功签名:进入到项目的bin/classes命令下,执行命令 javah com.example.jni.MainActivity,将生成的头文件拷贝到jni目录下,在c文件中引入头文件 #include "com_example_jni_MainActivity.h" 。下面是javah命令的参数 和 生产头文件方式。


2.3 创建C文件

#include <stdio.h>
#include <jni.h>
#include <malloc.h>
#include "com_example_jni_MainActivity.h"; JNIEXPORT jstring JNICALL Java_com_example_jni_MainActivity_helloFormC
(JNIEnv * env, jobject obj){ return (*env)->NewStringUTF(env,"hello from c ... ");
}

2.4 通过cygwin编译c文件,进入到项目目录,我的项目名称是jni,进入之后执行“ndk-build”命令,出现如下图所示表示执行成功。

2.5 创建Android.mk文件,需要将hello-jni替换成自己的c文件模块名称,在ndk中的位置 file:///D:/cgwin/android-ndk-r7b/docs/ANDROID-MK.html:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := Hello
LOCAL_SRC_FILES := Hello.c
include $(BUILD_SHARED_LIBRARY)
2.6 在android项目中的java文件引入编译生成的二进制文件。
static{
//加载二进制文件
System.loadLibrary("Hello");//libHello.so 去掉lib和so
}
2.7 最后部署项目,运行就可以看到调用成功。
----------------------------------------
待整理
Android.mk文件增加LOCAL_LDLIBS += -llog
C代码中增加
#include <android/log.h>
#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
LOGI("info\n");
LOGD("debug\n");
jstringJava_cn_itcast_ndk_DemoActivity_helloFromJNI(JNIEnv *env, jobjectjavaThis) {
return (*env)->NewStringUTF(env, "Hello from native code!");
}
JNIEnv类型代表了java环境 通过JNIEnv* 指针,就可以对java端的代码进行操作.
创建java类的对象,调用java对象的方法
获取java对象的属性 等等.
jobject是个什么
jobjectobj就是当前方法所在的类代表的对象.
七、Android学习笔记_JNI hello world的更多相关文章
- Android学习笔记_JNI hello world
1.需要准备的工具,eclipse,cdt(c++)插件,cygwin(unix)和 android ndk. 在cygwin的etc目录下将ndk的路径引入到profile文件中,可以在cygwin ...
- Android 学习笔记之Volley(七)实现Json数据加载和解析...
学习内容: 1.使用Volley实现异步加载Json数据... Volley的第二大请求就是通过发送请求异步实现Json数据信息的加载,加载Json数据有两种方式,一种是通过获取Json对象,然后 ...
- 【转】 Pro Android学习笔记(七八):服务(3):远程服务:AIDL文件
目录(?)[-] 在AIDL中定义服务接口 根据AIDL文件自动生成接口代码 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.n ...
- 【转】 Pro Android学习笔记(七六):服务(1):local和remote
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Android提供服务,服务是运行在后台的 ...
- 【转】 Pro Android学习笔记(七四):HTTP服务(8):使用后台线程AsyncTask
目录(?)[-] 5秒超时异常 AsyncTask 实现AsyncTask抽象类 对AsyncTask的调用 在哪里运行 其他重要method 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注 ...
- 【转】 Pro Android学习笔记(七五):HTTP服务(9):DownloadManager
目录(?)[-] 小例子 保存在哪里下载文件信息设置和读取 查看下载状态和取消下载 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog.csd ...
- 【转】 Pro Android学习笔记(七十):HTTP服务(4):SOAP/JSON/XML、异常
目录(?)[-] SOAP JSON和XMLPullParser Exception处理 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件,转载须注明出处:http://blog. ...
- 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET
目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...
- 【转】 Pro Android学习笔记(五七):Preferences(1):ListPreference
目录(?)[-] 例子1ListPreference小例子 定义一个preferences XML文件 继承PreferenceActivity 用户定制偏好的读取 第一次运行时设置缺省值 设置Cat ...
随机推荐
- Codeforces Gym 100187E E. Two Labyrinths bfs
E. Two Labyrinths Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/prob ...
- bzoj 1026 [SCOI2009]windy数 数位dp
1026: [SCOI2009]windy数 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline ...
- 32位Windows7上8G内存使用感受+xp 32位下使用8G内存 (转)
32位Windows7上8G内存使用感受+xp 32位下使用8G内存 博客分类: Windows XPWindowsIE企业应用软件测试 我推荐做开发的朋友:赶快加入8G的行列吧....呵呵..超爽 ...
- ntoskrnl.exe损坏或丢失的解决方式
同事的电脑启动时出现下面提示:"因下面文件损坏或丢失Windows无法启动 %systemroot%\system32\ntoskrnl.exe,请又一次安装以上文件的拷贝"(Wi ...
- C++ Code_Slider
主题 1. 滑块控件属性设置 2. 使用滑块控件设置颜色 3. 显示Slider的数值 4. 5. 属性 滑块控件属性设置 //代码设置属性 代码:: ////////////// ...
- android中判断sim卡状态和读取联系人资料的方法
在写程序中,有时候可能需要获取sim卡中的一些联系人资料.在获取sim卡联系人前,我们一般会先判断sim卡状态,找到sim卡后再获取它的资料,如下代码我们可以读取sim卡中的联系人的一些信息. Pho ...
- DB2数据库性能优化介绍
DB2数据库性能优化介绍 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 前段时间,我从CSDN得到了这本书<DB2数据库性能调整和优化(第2版)& ...
- [Angular 2 Router] Configure Your First Angular 2 Route
Using the Angular 2 router requires defining routes, passing them in to the RouterModule.forRoot and ...
- DP之矩阵连乘问题
最优二叉查找树的一道思考习题 同最优二叉查找树一样,矩阵连乘问题也是一个卡特兰数问题(其动态规划的构造过程都很像) 分析解答: a,铺垫的数学知识首先要搞清楚矩阵相乘是怎么乘的: 1)对于连续的n个矩 ...
- linux 体系结构知识 博客
http://blog.csdn.net/haiross/article/category/1488205/3