`
jiagou
  • 浏览: 2529575 次
文章分类
社区版块
存档分类
最新评论

android jni 程序框架搭建

 
阅读更多


android上 jni开发 应用构建过程基本一致,下面 结合最近 在android 上实现 jni层 绘制 surfaceview 功能 阐述 带jni的apk构建过程。


apk 目录结构:


├── AndroidManifest.xml
├── Android.mk
├── jni
│ ├── Android.mk
│ ├── logger.cpp
│ ├── logger.h
│ ├── OnLoad.cpp
│ └── SurfaceviewJni.cpp
├── libs
│ └── armeabi
│     └── libsurfaceviewJni.so
├── res
│ ├── layout
│ │ └── hello_activity.xml
│ └── values
│     └── strings.xml
└── src
    └── com
        └── example
            └── android
                └── jnisurfaceview
                    ├── JavasurfaceView.java
                    └── JniSurfaceViewActivity.java



1. java类中 static 块 加载动态库及java层本地方法声明 :

static {

System.loadLibrary("surfaceviewJni");
}

private native void nativeSetSurface(Surface surface);
private native void nativeDraw(String path ,int width, int height);

2 . 编写 jni makefile

jni/Android.mk

#lib for jnisurfaceview
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_LDLIBS := \
        -lm -lstdc++ -lgcc -llog


LOCAL_SRC_FILES := \
		OnLoad.cpp \
		SurfaceviewJni.cpp \
                logger.cpp

#LOCAL_SHARED_LIBRARIES := libsurfaceviewJni
LOCAL_SYSTEM_SHARED_LIBRARIES := libc libstdc++ libutils 

LOCAL_MODULE := libsurfaceviewJni

include $(BUILD_SHARED_LIBRARY)

3. 编写 apk makefile


LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

# Only compile source java files in this apk.
LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_PACKAGE_NAME := JniSurfaceView
#LOCAL_JNI_SHARED_LIBRARIES := libsurfaceviewJni
#LOCAL_PRELINK_MODULE := false
include $(BUILD_PACKAGE)


4. C/C++代码中绑定java层和本地接口


这里的关键点在JNI_OnLoad 函数,java层在 load 动态库时虚拟机会首先调用动态库中的JNI_OnLoad,所以 java层接口和本地接口的绑定在JNI_OnLoad 函数中初始化即可,这也是android framework 的做法。


放在一个文件中:

OnLoad.cpp


/*
 * Desc: jni code for surfaceview
 * Author :lidp
 */
 
#include <android/log.h>
#include <jni.h>
#include "logger.h"

#define TAG_JNISURFACEVIEW "jni surfaceview test"
static JavaVM *jvm = NULL;

int register_jnisurfaceview(JNIEnv* env);


JNJEnv* getEnv()
{
	JNIEnv* env = NULL;
	if(jvm->GetEnv(void**)&env, JNI_VERSION_1_4) != JNI_OK) {
		return NULL;
		droid_log(LOG_ERROR,"failed in get jvm\n");
	}

	return env;
}

//this function will be called by jvm on load shared lib

jint JNI_OnLoad(JavaVM *vm,void* reserved)
{
	JNIEnv* env = NULL;
	jint ret = JNI_ERR;

	droid_log(LOG_DEBUG,"Jni Onload be called\n");

	jvm = vm;
	
	if(jvm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK) {
		droid_log(LOG_ERROR,"failed get jvm\n");
		return ret;

	}

	if(register_jnisurfaceview(env) != JNI_OK)
		return ret;

	;
	return JNI_VERSION_1_4;
}

5. 实现接口代码:


SurfaceviewJni.cpp


#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <android/log.h>
#include "logger.h"
#include <jni.h>

struct JavaGule {
	jobject jsurface;
};

static struct JavaGule gule;

//code pase from framework jnihelp.cpp
static int jniRegisterNativeMethods(JNIEnv* env, const char* className, const JNINativeMethod* gMethods, int numMethods)
{
    jclass clazz;

	droid_log(LOG_DEBUG, "register native method for class %s\n", className);
    clazz = env->FindClass(className);
    if (clazz == NULL)
        return -1;

    if (env->RegisterNatives(clazz, gMethods, numMethods) < 0)
        return -1;

    return 0;
}

static void jnisurfaceview_draw(JNIEnv *env, jobject obj, jstring photopath, jint w, jint h)
{
	droid_log(LOG_DEBUG, "native draw be called \n");

	jclass sufaceClass = env->FindClass("android/view/Surface");
	if(sufaceClass == NULL) {
		droid_log(LOG_ERROR,"Cant not find android/view/Surface class\n");
		return;
	}

	jfieldID surfaceID = env->GetFieldID(sufaceClass, "mSurface", "I");
    if (surfaceID == NULL) {
        droid_log(LOG_ERROR,"Can't find Surface.mSurface");
        return;
    }

	//sp<Surface> surface = (Surface *)env->GetIntField(gule.jsurface, surfaceID);
	/*
	if(surface.isValid()) {
		

	} else {
		droid_log(LOG_ERROR, "cant get surface\n");
	}
	*/

	
}

static void jnisurfaceview_setSurface(JNIEnv *env, jobject obj, jobject javasurface)
{
	droid_log(LOG_DEBUG, "native setSurface be called \n");
	
	gule.jsurface = javasurface;
}

static JNINativeMethod gmethods[] = {
		{"nativeDraw", "(Ljava/lang/String;II)V", (void *)jnisurfaceview_draw},
		{"nativeSetSurface", "(Landroid/view/Surface;)V", (void*)jnisurfaceview_setSurface},
};

int register_jnisurfaceview(JNIEnv* env)
{
	return jniRegisterNativeMethods(env,"com/example/android/jnisurfaceview/JavasurfaceView", gmethods, sizeof(gmethods)/sizeof(gmethods[0]));
}


6. ndk_build 编译 jni目录,生成动态库到 libs目录,

apk 根目录 执行 mm 生成apk.


注意:

这里本地代码用到了 ndk提供的log 接口 android/log.h 所以在makefile中要连接log动态库 用参数

LOCAL_LDLIBS := \
        -lm -lstdc++ -lgcc -llog

上面的 c++代码即包含 java->c++的调用也包含 C++ -> java的反调用。


ok.


csdn lidp 原创,转载著名出处,谢谢。



分享到:
评论

相关推荐

    Android 初学中阶高阶书籍_集合打包2

    Android开发指南中文版-应用程序框架,Android驱动开发入门及手机案例开发分析教程,Android手机开发应用案例分析之手机 版开心网功能实现,Android硬件驱动开发关键技术和HAL移植要领,Android中文翻译组——Android...

    Android 初学中阶高阶书籍_集合打包3

    Android开发指南中文版-应用程序框架,Android驱动开发入门及手机案例开发分析教程,Android手机开发应用案例分析之手机 版开心网功能实现,Android硬件驱动开发关键技术和HAL移植要领,Android中文翻译组——Android...

    android系统原理及开发要点详解

     第13章“Android应用程序概述及框架”,介绍Android应用程序层的基本概念和应用程序框架,这部分内容是Android自下而上的第4个层次,可以基于源代码或者SDK开发,它们之间的差别非常小。  第14章“Android应用...

    Android应用开发揭秘pdf高清版

    1.1.3 Android应用程序框架 1.2 OMS介绍 1.2.1 OPhone介绍 1.2.2 Widget介绍 1.3 小结 第2章 Android开发环境搭建 2.1 Android开发准备工作 2.2 开发包及其工具的安装和 配置 2.2.1 安装JDK和配置Java开发 环境 ...

    《Android应用开发揭秘》附带光盘代码.

     1.1.3 Android应用程序框架  1.2 OMS介绍  1.2.1 OPhone介绍  1.2.2 Widget介绍  1.3 小结  第2章 Android开发环境搭建  2.1 Android开发准备工作  2.2 开发包及其工具的安装和  配置  2.2.1 安装JDK和...

    《Android应用开发揭秘》源码

     1.1.3 Android应用程序框架  1.2 OMS介绍  1.2.1 OPhone介绍  1.2.2 Widget介绍  1.3 小结  第2章 Android开发环境搭建  2.1 Android开发准备工作  2.2 开发包及其工具的安装和配置  2.2.1 安装JDK和配置...

    android系统原理及开发要点详解_韩超_梁泉 4

     第13章“Android应用程序概述及框架”,介绍Android应用程序层的基本概念和应用程序框架,这部分内容是Android自下而上的第4个层次,可以基于源代码或者SDK开发,它们之间的差别非常小。  第14章“Android应用...

    Android底层开发技术实战详解--内核、移植和驱动.(电子工业.王振丽).part1

    2.3.4 实践演练——演示编译Android程序的两种方法 43 2.4 编译Android kernel 47 2.4.1 获取goldfish内核代码 47 2.4.2 获取msm内核代码 50 2.4.3 获取omap内核代码 50 2.4.4 编译Android...

    android系统原理及开发要点详解_韩超_梁泉 1

     第13章“Android应用程序概述及框架”,介绍Android应用程序层的基本概念和应用程序框架,这部分内容是Android自下而上的第4个层次,可以基于源代码或者SDK开发,它们之间的差别非常小。  第14章“Android应用...

    Android 4游戏编程入门经典

     1.4.4 应用程序框架  1.5 软件开发工具包  1.6 开发人员社区  1.7 设备,设备,设备  1.7.1 硬件  1.7.2 设备的范围  1.8 所有设备之间的兼容性  1.9 不同的手机游戏  1.9.1 人手一台游戏机  1.9.2 随时...

    新版Android开发教程.rar

    • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • 集成的浏览器 基于开源的 WebKit 引擎 • 优化的图形库 包括定制的 2D 图形库, 3D 图形库基于 OpenGL ES 1.0 ...

    Android底层开发技术实战详解--内核、移植和驱动.(电子工业.王振丽).part3

    2.3.4 实践演练——演示编译Android程序的两种方法 43 2.4 编译Android kernel 47 2.4.1 获取goldfish内核代码 47 2.4.2 获取msm内核代码 50 2.4.3 获取omap内核代码 50 2.4.4 编译Android...

    Android技术内幕.系统卷 pdf

    6.2.3 android sqlite框架及原理 /285 6.3 扩展库 /289 6.3.1 skia底层库分析 /289 6.3.2 opengl底层库分析 /299 6.3.3 android-openssl实现及运用 /306 6.3.4 freetype及font engine manager /317 6.3.5 ...

    深入理解Android:卷I--详细书签版

     本书是在分析Android源码的基础上展开的,而源码文件所在的路径一般都很长,例如,文件AndroidRuntime.cpp的真实路径就是framework/base/core/jni/AndroidRuntime.cpp。为了书 写方便起见,我们在各章节开头把该...

    android游戏编程入门

     1.4.4 应用程序框架 8  1.5 软件开发工具包 8  1.6 开发人员社区 9  1.7 设备,设备,设备 9  1.7.1 硬件 9  1.7.2 设备的范围 10  1.8 所有设备之间的兼容性 15  1.9 不同的手机游戏 15  1.9.1 人手一台...

    Android底层开发技术实战详解--内核、移植和驱动.(电子工业.王振丽).part2

    2.3.4 实践演练——演示编译Android程序的两种方法 43 2.4 编译Android kernel 47 2.4.1 获取goldfish内核代码 47 2.4.2 获取msm内核代码 50 2.4.3 获取omap内核代码 50 2.4.4 编译Android...

    利用OpenCV实现在Android系统下的人脸检测 (2011年)

    简单介绍了开发环境搭建以及利用Android程序框架实现此应用程序的过程,同时详细阐述了利用JNI( Java Native Interface) 调用OpenCV相关函数的具体步骤,以及采用Android NDK( Native Development Kit)生成共享库的...

Global site tag (gtag.js) - Google Analytics