第一个JNI例子

Eclipse开发C/C++环境配置中我们介绍了Eclipse开发C/C++的环境配置。在Android的开发中,有时我们需要使用JNI的形式来开发。谷歌改良了ndk的开发流程,对于Windows环境下NDK的开发,如果使用的NDK是r7之前的版本,必须要安装Cygwin才能使用NDK。而在NDKr7开始,Google的Windows版的NDK提供了一个ndk-build.cmd的脚本,这样,就可以直接利用这个脚本编译,而不需要使用Cygwin了。只需要将NDT工具配置在external tools configurations就可以了。


一、开发工具的配置
下载ndk,建议下载r8及以上版本,方便使用。在External Tools Configuration中配置javah和ndk-build两个工具。
(1)、配置javah工具,用于将我们的native方法生成对应的.h头文件。




(2)、配置ndk工具,用于将我们实现的.c和.h文件进行编译,生成.so包的形式。




二、简单JNI开发流程。
1、创建一个Android Application工程,在src目录下创建JNITest.java的类。
public class JNITest {
	public native boolean init();
	public native int add(int x,int y);
	public native void destroy();
}
2、我们点击创建的External工具javah。系统进行编译生成jni文件夹,里面包含创建的.h头文件。
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_dsw_jnitst_JNITest */


#ifndef _Included_com_dsw_jnitst_JNITest
#define _Included_com_dsw_jnitst_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_dsw_jnitst_JNITest
 * Method:    init
 * Signature: ()Z
 */
JNIEXPORT jboolean JNICALL Java_com_dsw_jnitst_JNITest_init
  (JNIEnv *, jobject);


/*
 * Class:     com_dsw_jnitst_JNITest
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_dsw_jnitst_JNITest_add
  (JNIEnv *, jobject, jint, jint);


/*
 * Class:     com_dsw_jnitst_JNITest
 * Method:    destroy
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_dsw_jnitst_JNITest_destroy
  (JNIEnv *, jobject);


#ifdef __cplusplus
}
#endif
#endif

可以看到自动生成对应的函数:Java_com_lucyfyr_HelloWorld_printJNI

    Java_ + 包名(com.lucyfyr) 类名(HelloWorld) + 接口名(printJNI):必须要按此JNI规范来操作;


3、实现我们的头文件中定义的函数,创建com_dsw_jnitst_JNITest.c文件,我们挑一个函数进行实现。
#include <jni.h>
#include "com_dsw_jnitst_JNITest.h"


JNIEXPORT jint JNICALL Java_com_dsw_jnitst_JNITest_add
  (JNIEnv *env, jobject obj, jint a, jint b){
	return a + b;
}


4、然后在jni文件夹下创建Android.mk文件。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)


LOCAL_MODULE := JNITst
LOCAL_SRC_FILES := com_dsw_jnitst_JNITest.c


include $(BUILD_SHARED_LIBRARY)

5、最后,我们通过创建的ndk工具进行编译,生成.so文件。

在MainActivity中进行使用:
public class MainActivity extends Activity {


	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		TextView tv = (TextView) findViewById(R.id.add);
		tv.setText("5 + 4=" + addNumber(5,4));
	}
	
	static{
		System.loadLibrary("JNITst");
	}
	
	private int addNumber(int a,int b ){
		JNITest jniTest = new JNITest();
		return jniTest.add(a, b);
	}
}
这样就完成了基本使用。这里主要简单记录下过程,深入的知识还需学习,我们知道jni文件夹毕竟属于Android工程,怎么能编译C代码呢?这里就需要使用我们的CDT搭建的环境,创建一个C的share library工程,将头文件拷贝到C工程,然后进行开发编译测试。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值