第一个JNI例子

版权声明:转载注明出处,谢谢合作。 https://blog.csdn.net/Mr_dsw/article/details/52048102
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工程,然后进行开发编译测试。
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页