在网上找的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组成:
(

在windows下执行javah不通过, houl后来通过下面的方式搞定

D:\workspace\JniDemo\src>javah com.example.jnidemo.MainActivityD:\workspace\JniDemo\src>

)

sw02:~$cd workspace/DemoJni/
sw02:~/workspace/DemoJni$mkdir jni
sw02:~/workspace/DemoJni$cd jni/
sw02:~/workspace/DemoJni/jni$javah -classpath ../bin/classes/ -jni com.example.demojni.MainActivity
sw02:~/workspace/DemoJni/jni$ls
com_example_demojni_MainActivity.h
sw02:~/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_MainActivity
LOCAL_SRC_FILES := com_example_demojni_MainActivity.c
include $(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.c
SharedLibrary  : libcom_example_demojni_MainActivity.so
Install        : libcom_example_demojni_MainActivity.so => libs/armeabi/libcom_example_demojni_MainActivity.so
sw02:~/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相关推荐

  1. 安卓linux交叉编译,Linux Ubuntu下用Android NDK 生成独立交叉编译链

    本文主要介绍使用Android NDK生成独立交叉编译链,然后使用独立交叉编译链编译Android程序 下载NDK 下载与自己操作系统相吻合的版本 下载地址 解压到安装目录(如~/myndk): ta ...

  2. Ubuntu下编译Android源代码

    上一次将了Ubuntu下下再Android源代码,地址:http://blog.csdn.net/zqiang_55/article/details/7173392 现在来说说Ubuntu下边缘And ...

  3. ubuntu下搭建android开发环境(转载)

    在ubuntu下搭建android开发环境,准备学习一下android开发. 1.安装JDK        首先到oracle的官网上下载linux版本的JDK(网址为:http://www.orac ...

  4. Ubuntu下创建Android Studio启动图标

    Ubuntu下创建Android Studio启动图标 问题 解决方法1 解决方法2 脚本 问题 Linux发行版的Android Studio没有启动图标 解决方法1 第一次通过终端启动bin/st ...

  5. 手机安装linux模拟器教程,Ubuntu下安装Android模拟器

    Ubuntu下安装Android模拟器首先确保已安装Java平台. 2.将下载的包解压. 3.先后运行命令: # cd android-sdk-linux/tools (进入目录,省略号处填你的路径) ...

  6. ubuntu下搭建android开发环境(四)核心篇安装AndroidStudio、sdk、jdk

    [置顶] ubuntu下搭建android开发环境(四)核心篇安装AndroidStudio.sdk.jdk(by 星空武哥) <div class="article_manage c ...

  7. 开发日记-20190905 关键词 Linux (Ubuntu) 下的Android模拟器:Genymotion

    参考于: Ubuntu下,访问不了Google,怎么安装Vysor插件? ubuntu 16.04下android调试工具 Vysor 安装及使用注意 Ubuntu下genymotion模拟器的安装与 ...

  8. Ubuntu下安装Android Studio

    一.系统环境 系统环境 二.安装源文件 Android Studio 3.2.0: android-studio-ide-181.5014246-linux.zip Java SE Developme ...

  9. android rom签名 作用,Ubuntu下折腾Android笔记(一)——ROM 签名 | 翅膀~

    2010.8.30 UPDATE:java环境的配置也可以直接使用openjdk,打开终端 sudo apt-get install openjdk-6-jre 就可以了. ------------- ...

最新文章

  1. golang select关键字用法
  2. android 应用程序分析之settings,Android 应用程序分析之Settings
  3. windows 2012 apache php mysql_Windows Server 2012 R2搭建 Apache+PHP+MYSQL环境
  4. 可再生能源建设提速 风电光伏业高景气可期
  5. 支持 Drupal 的 虚拟空间
  6. winform 程序制作自己的数字签名(续)
  7. linux结构体数组的定义数组,task_struct结构体中的run_list和array域
  8. 微服务架构的分布式事务解决方案(Dubbo分布式事务处理)
  9. 牛客网--华为机试在线训练10:字符个数统计
  10. [CTO札记]研究:日本Rakuten(乐天)
  11. 电子工业出版社PPT图书优秀作者上海书城讲座
  12. 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)以及禁止游戏中自动锁屏问题!
  13. HR面试问题-你的缺点是什么?
  14. Mac下编写C或C++
  15. window10 几款好用的屏幕录制制作动图工具
  16. 用python来压缩图片的大小
  17. 查询大全,肯定有你需要的!
  18. 小程序如何开发商城系统
  19. 冲刺阶段 - PMP易错概念(持续更新中)
  20. 秋裤传奇html5,秋裤传奇

热门文章

  1. 谷歌以54亿美元收购网络安全公司、数百万惠普设备存在高危漏洞|3月10日全球网络安全热点
  2. 大型电子商务网站架构
  3. 学计算机画素描吗,怎样在电脑上画素描?
  4. 【观察】从最佳实践走向行业赋能,华为重构数字化办公新体验
  5. 数据可视化BI平台选型调研报告 Superset VS Redash VS Metabase
  6. 告别笨重卡慢的PyCharm,使用Nodepad++ python编程
  7. 程序员:怎样才能学好英语?
  8. oracle中 unino,union all,minus,intersect的用法
  9. 雅虎高管解读财报 当务之急是分拆资产
  10. python语句的执行结果是_以下是 print( \nPython)语句运行结果的是().