ubuntu下的android JNI入门DEMO
来源:互联网 发布:神舟战神笔记本知乎 编辑:程序博客网 时间:2024/05/28 01:35
在网上找的jni demo在对着练习的时候,总是多多少少报错. 所以把自己的摸索记录下来
环境:
Ubuntu 10.04 LTS
eclipse:
http://developer.android.com/sdk/index.html
NDK:
http://developer.android.com/tools/sdk/ndk/index.html
本demo的功能是往sdcard目录下的test.txt文件写入字符串"1"
1. 创建一个activity, 名为:DemoJni,其他默认
2. 在系统生成的MainActivity.java中添加
public native int writeFiles(int writeData);
writeFiles(1);
, 然后在eclipse里面编译一下, 添加后整体代码如下:
package com.example.demojni;import android.os.Bundle;import android.app.Activity;import android.view.Menu;public class MainActivity extends Activity {public native int writeFiles(int writeData);@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);writeFiles(1);} @Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}}
3. 进入该工程的根目录, 建立jni文件夹,并进入该文件夹, 然后运行:
javah -classpath ../bin/classes/ -jni com.example.demojni.MainActivity
其中-jni后面的参数是由上面代码中的包名com.example.demojni+类名MainActivity组成:
sw02:~$cd workspace/DemoJni/sw02:~/workspace/DemoJni$mkdir jnisw02:~/workspace/DemoJni$cd jni/sw02:~/workspace/DemoJni/jni$javah -classpath ../bin/classes/ -jni com.example.demojni.MainActivitysw02:~/workspace/DemoJni/jni$lscom_example_demojni_MainActivity.hsw02:~/workspace/DemoJni/jni$
此时即生成了com_example_demojni_MainActivity.h
然后创建同名的.c文件
sw02:~/workspace/DemoJni/jni$touch com_example_demojni_MainActivity.c
sw02:~/workspace/DemoJni/jni$ls
com_example_demojni_MainActivity.c com_example_demojni_MainActivity.h
sw02:~/workspace/DemoJni/jni$
然后创建Android.mk文件
sw02:~/workspace/DemoJni/jni$touch Android.mk
sw02:~/workspace/DemoJni/jni$ls
Android.mk com_example_demojni_MainActivity.c com_example_demojni_MainActivity.h
sw02:~/workspace/DemoJni/jni$
回到eclise工程目录刷新一下, 就可以看见上面生成以及添加的这些文件:
在eclipse中编辑com_example_demojni_MainActivity.c文件, 如下:
#include <fcntl.h>#include <errno.h>#include <stdlib.h>#include <stdio.h>#include <unistd.h>#include <errno.h>#include <string.h>#include <sys/stat.h>#include <sys/types.h>#include "com_example_demojni_MainActivity.h"#define DEVICE_NAME "/sdcard/test.txt"JNIEXPORT jint JNICALL Java_com_example_demojni_MainActivity_writeFiles (JNIEnv * env, jobject obj, jint data){ int nwr, ret, fd; char value[20]={0}; fd = open(DEVICE_NAME, O_RDWR|O_CREAT); if(fd < 0) return -1; nwr = sprintf(value, "%d\n", data); ret = write(fd, value, nwr); close(fd); return (ret == nwr) ? 0 : -1;}其中函数名Java_com_example_demojni_MainActivity_writeFiles是根据.h中的声明拷贝过来的
编辑Android.mk文件:
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := com_example_demojni_MainActivityLOCAL_SRC_FILES := com_example_demojni_MainActivity.cinclude $(BUILD_SHARED_LIBRARY)
其中LOCAL_SRC_FILES就是该目录下的.c文件名,
LOCAL_MODULE就是红色部分去掉.c, 且只能这么写,否则运行报错
至于能不能写成其他的或者写成其他字符串为什么报错请高手赐教.
再次回到终端, 运行ndk-build
sw02:~/workspace/DemoJni/jni$ndk-build /usr/local/ndk/build/core/add-application.mk:128: Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in /home/sw02/workspace/DemoJni/AndroidManifest.xml Compile thumb : com_example_demojni_MainActivity <= com_example_demojni_MainActivity.cSharedLibrary : libcom_example_demojni_MainActivity.soInstall : libcom_example_demojni_MainActivity.so => libs/armeabi/libcom_example_demojni_MainActivity.sosw02:~/workspace/DemoJni/jni$
ndk-build成功后,回到eclise, 刷新一下,即可看到编出来的libcom_example_demojni_MainActivity.so文件
最后在MainActivity,java添加代码:
package com.example.demojni;import android.os.Bundle;import android.app.Activity;import android.view.Menu;public class MainActivity extends Activity {public native int writeFiles(int writeData);@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);writeFiles(1);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}static {System.loadLibrary("com_example_demojni_MainActivity");}}
其中System.loadLibrary("com_example_demojni_MainActivity");为添加的部分,
com_example_demojni_MainActivity 就是android.mk中LOCAL_MODULE的值
再次编译工程.
至此,完成此demo的编码,
我只在真机上验证过.
- ubuntu下的android JNI入门DEMO
- linux/ubuntu下使用jni的demo
- Android电视下的JNI demo
- ubuntu android JNI 入门
- Linux下JNI的demo
- Mac android studio JNI入门demo
- Ubuntu下Android JNI初步学习之——搭建相关环境和测试Demo
- JNI 入门DEMO
- Ubuntu下编译Android JNI最靠谱的方法...
- Ubuntu下编译Android JNI最靠谱的方法..
- JNI for Android, Android Studio NDK 入门 实例 demo
- Ubuntu下JNI的使用
- Android JNI demo编译遇到的错误
- Android Studio Jni开发详细入门,Aes加密demo
- Android Studio ndk-Jni开发详细入门,Aes加密demo
- Android Studio ndk-Jni开发详细入门,Aes加密demo
- android studio 2.1.2 版本 jni 入门demo
- Android JNI 入门——环境搭建及demo
- [PDF]C++ Primer英文版(第5版)电子书下载
- hdu1087 Super Jumping! Jumping! Jumping!
- linux-2.6.26内核中ARM中断实现详解
- 6410之linux中断处理结构
- 写给新手程序员的一封信
- ubuntu下的android JNI入门DEMO
- VIM配置中提取不带路径的文件名的方式
- LFS经验
- 结构体类型数据作为函数参数
- Auto Complete Tutorial for iOS: How To Auto Complete With Custom Values
- PhoneGap研究之二
- CoreData使用
- Spring中getHibernateTemplate()方法的多种用法
- 安卓截图(2.3中实现截屏)