码迷,mamicode.com
首页 > 移动开发 > 详细

【Android高级】NDK/JNI编程技术基础介绍

时间:2014-12-21 16:40:11      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:jni   ndk   c语言   android   cygwin   

      作为一个AndoirdJava程序员,会受到Java语言的局限,因为作为一面门向对象的语言不能像C/C++那样轻易调用与硬件有关的操作。因此JNI就搭建了这样一个桥梁,使JavaC/C++语言之间可以互相调用。作为一个Java工程师对C/C++的语言不是很熟悉,但只需熟悉他们之间调用的原理和方法,关于C/C++的编程就交给C语言工程师去吧。

     在这篇文章中主要介绍NDK/JIN搭建和基本使用方法。

一、 环境的搭建


二、 基本的使用

    步骤:

         (1)新建Android工程

         (2)在java中声明native方法

         (3)在工程中新建jni文件夹(使用javah  test 生成头文件,编写C代码)

         (4)编写Android.mk文件(是一个配置文件告诉NDK如何编译C代码)

               

   LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := test-jni
LOCAL_SRC_FILES := test-jni.c
LOCAL_LDLIBS+=-llog
include $(BUILD_SHARED_LIBRARY)

         (5)执行"ndk-build"生成动态库(在eclipse使用run也可以生成动态库)

         (6)java代码"load"动态库,调用动态库


        1、java调用C

                      java 调用native method(Class param)

                      在c中会调用的方法中参数(JNIEnv*,Jobject,Jint...)

        2、c调用java

       先用java调用c,c然后回调

JNIEXPORT void JNICALL Java_com_ndk2_test_ProvideBean_callHi(JNIEnv *env,
		jobject obj) {
	char*classname = "com/ndk2/test/ProvideBean";
	jclass clazz;
	clazz = (*env)->FindClass(env, classname);
	if (clazz == 0) {
		LOGI("can not find class");
	} else {
		LOGI("find the class");
	}

	jmethodID mid = (*env)->GetMethodID(env, clazz, "showHi", "()V");
	if (mid == 0) {
		LOGI("can not find method");
	} else {
		LOGI("find method");
	}
	(*env)->CallVoidMethod(env, obj, mid);

}
JNIEXPORT void JNICALL Java_com_ndk2_test_ProvideBean_calladd(JNIEnv *env,
		jobject obj) {
	char*classname = "com/ndk2/test/ProvideBean";
	jclass clazz;
	clazz = (*env)->FindClass(env, classname);
	if (clazz == 0) {
		LOGI("can not find class");
	} else {
		LOGI("find the class");
	}
	jmethodID mid = (*env)->GetMethodID(env, clazz, "showAdd", "(II)V");
	if (mid == 0) {
		LOGI("can not find method");
	} else {
		LOGI("find method");
	}
	(*env)->CallVoidMethod(env, obj, mid, 6, 7);

}
执行项目之前还要配置环境:

       c/c++ Bulid Build command:  bash D:\cygwin64\android-ndk-r8c\ndk-build

       c/c++ General/Paths and Symbols/GNU C add D:\cygwin64\android-ndk-r8c\platforms\android-14\arch-arm\usr\include

               如果还在报一些编译环境的错误,把工程转移到D:\cygwin64\android-ndk-r8c\samples基本就可以通过,这里我也不是很清楚是为什么,估计是路径映射的问题,哪位大神知道,可以分享下。


                

  

【Android高级】NDK/JNI编程技术基础介绍

标签:jni   ndk   c语言   android   cygwin   

原文地址:http://blog.csdn.net/scboyhj__/article/details/42060933

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!