ubuntu下的android JNI入门DEMO

在网上找的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);
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		writeFiles(1);
	}  

	@Override
	public 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.MainActivity

D:\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);
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		writeFiles(1);
	}


	@Override
	public 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的编码, 
我只在真机上验证过.

 

 

 

 

 

 

 

 
 
 
 
 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值