`
hzy3774
  • 浏览: 984806 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Android中使用jni进行本地开发

 
阅读更多

首先要下载eclipse_java,安装ADT,CDT,NDK,

在MainActivity中写一些本地函数声明:

    public native void fun1();
    public native String fun2();
    public native char fun3();
    public native int fun4();
    public native double fun5();
    public native void fun6(int i, String s);

 

配置好Java环境变量;



 

然后控制台进入项目的bin/classes,输入javah -jni命令,生成相关.h头文件;



 如果报找不到Activity类的话可以暂时去掉MainActivity中的extends Activity声明,并把与Activity相关代码注释,再次编译后运行javah -jni,就没有错了,这时生成一个.h头文件,com_example_jnitest_MainActivity.h

在工程中创建jni目录,把头文件移动到里面,头文件里包含了以后要在.c文件中书写的函数:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jnitest_MainActivity */

#ifndef _Included_com_example_jnitest_MainActivity
#define _Included_com_example_jnitest_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_jnitest_MainActivity
 * Method:    fun1
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_example_jnitest_MainActivity_fun1
  (JNIEnv *, jobject);

/*
 * Class:     com_example_jnitest_MainActivity
 * Method:    fun2
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_jnitest_MainActivity_fun2
  (JNIEnv *, jobject);

/*
 * Class:     com_example_jnitest_MainActivity
 * Method:    fun3
 * Signature: ()C
 */
JNIEXPORT jchar JNICALL Java_com_example_jnitest_MainActivity_fun3
  (JNIEnv *, jobject);

/*
 * Class:     com_example_jnitest_MainActivity
 * Method:    fun4
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_example_jnitest_MainActivity_fun4
  (JNIEnv *, jobject);

/*
 * Class:     com_example_jnitest_MainActivity
 * Method:    fun5
 * Signature: ()D
 */
JNIEXPORT jdouble JNICALL Java_com_example_jnitest_MainActivity_fun5
  (JNIEnv *, jobject);

/*
 * Class:     com_example_jnitest_MainActivity
 * Method:    fun6
 * Signature: (ILjava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_example_jnitest_MainActivity_fun6
  (JNIEnv *, jobject, jint, jstring);

#ifdef __cplusplus
}
#endif
#endif

 

与java原文件中相应的native函数都已经在这个头文件中声明好了,以后只要按相应的函数名书写函数,就可以在java原文件中调用。

写一个Android.mk文件,该文件说明了.c文件编译的相关信息:



 

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := myjni
LOCAL_SRC_FILES := main.c

include $(BUILD_SHARED_LIBRARY)

 其中指明了将main.c便以为myjni;

所以开始写一个main.c

 

#include<jni.h>
#include<string.h>

void JNICALL Java_com_example_jnitest_MainActivity_fun1
  (JNIEnv *, jobject);

jstring Java_com_example_jnitest_MainActivity_fun2
  (JNIEnv *e, jobject o){
	return (*e)->NewStringUTF(e, "I am a string from jni, good!");
}

jchar Java_com_example_jnitest_MainActivity_fun3
  (JNIEnv *, jobject);

jint Java_com_example_jnitest_MainActivity_fun4
  (JNIEnv *, jobject);

jdouble Java_com_example_jnitest_MainActivity_fun5
  (JNIEnv *, jobject);

void Java_com_example_jnitest_MainActivity_fun6
  (JNIEnv *, jobject, jint, jstring);

 

至于语法可以参考其他资料

然后就要为项目添加C编译器来将C代码编译成so文件以便调用:

单击项目->属性:



 

 在builders选项卡中选new,添加一个Program编译器:



 编译器配置界面:



 Location是NDK解压目录下的ndk-build.cmd

WorkingDirectory选择当前项目空间,保存



 

这时编译器列表中多了一个编译器,将其通过Up移到最高处,以使C代码能在最先编译

每次便以项目时:Console会显示:

"Compile thumb : myjni <= main.c

SharedLibrary  : libmyjni.so

Install        : libmyjni.so => libs/armeabi/libmyjni.so

 

说明编译成功,项目中的lib多了.so文件:



 在java代码中通过以下声明调用该链接库:

static{
    	System.loadLibrary("myjni");
    }

 

 

NDK目录下samples文件夹下提供了一些实例可供参考

  • 大小: 68.2 KB
  • 大小: 12.8 KB
  • 大小: 6.8 KB
  • 大小: 70.6 KB
  • 大小: 26.5 KB
  • 大小: 98.7 KB
  • 大小: 15.2 KB
  • 大小: 5.5 KB
  • jni.pdf (3.4 MB)
  • 下载次数: 10
  • 大小: 15.8 KB
分享到:
评论

相关推荐

    android_jni_demo

    Android 开发中JNI的使用总结, JNI是Java Native Interface 的缩写,意为java本地接口, 使用JNI技术可以使得java语言与其它开发语言(如 C、C++ 和汇编语言)编写的应用程序或库进行相互操作。Android系统中的JNI运行...

    Android项目_jni操作指南.rar

    7. 实际案例:通过一个完整的示例项目,展示了如何在实际开发中运用JNI技术实现Java与C/C++的交互。 本资源适合对Android开发有一定基础的开发者,可以帮助您快速掌握JNI技术的使用方法,为您的项目添加更多功能。...

    AndroidStudio_3.0版本JNI开发

    JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以...

    JNI开发——不同class类中的native本地方法的动态注册

    这是Android中JNI开发中动态注册多个类的native方法,以及分模块化管理不同native的代码.

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

     第3章“Android的Linux内核与驱动程序”,介绍Android内核的特点、Android中使用的专用驱动程序、Android系统可能使用的标准设备驱动。  第4章“Android的底层库和程序”,介绍Android系统的基础程序,以本地程序...

    android-jni.ppt

    让你快速了解jni开发技术。JNI java本地开发接口 JNI 是一个协议 这个协议用来沟通java代码和外部的本地代码(c/c++). 通过这个协议,java代码就可以调用外部的c/c++代码 外部的c/c++代码也可以调用java代码

    android jni 实现本地加解密数据,使用C++语言编写 ,基于openssl实现 .zip

    包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。 包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python...

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

    《Android应用开发揭秘》全部实例源代码,... 16.4 AndroidNDK中使用0penGL  16.5小结  第17章 Android脚本环境  17.1 Android脚本环境简介  17.2 Android脚本环境安装  17.3如何编写Android脚本程序  17.4小结

    Android应用开发揭秘pdf高清版

    它还以迭代的方式重现了各种常用的Android应用和经典Android游戏的开发全过程,既可以以它们为范例进行实战演练,又可以将它们直接应用到实际开发中去。 目录 -------------------------------------------------...

    Android NDK开发文档本地版

    Android JNI开发指南 Android.mk Application.mk-

    《Android应用开发揭秘》源码

    作者简介  杨丰盛,Android应用开发先驱... 16.4 AndroidNDK中使用0penGL  16.5小结  第17章 Android脚本环境  17.1 Android脚本环境简介  17.2 Android脚本环境安装  17.3如何编写Android脚本程序  17.4小结

    NDK开发的简单实例(JNI及Android的C组件实现)

    1、编译本地调用的JAVA类 2、使用javah从JAVA类中转换成相应的头文件(已有genHeader.bat的脚本直接生成,其中的com.ex.sot.NativeDataManage是相应的类,需依据实现作修改) 3、实现相对应的*.c并调用C组件(在jni...

    android 完全中文版 开发应用详解

    5.3.3 在应用程序中使用jni 99 5.4 系统服务的java部分 101 5.4.1 binder 102 5.4.2 servicemanager 103 5.4.3 系统进程 103 第6章 android的gui系统 106 6.1 android gui系统综述 106 6.2 pixelflinger和libui库 ...

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

     第3章“Android的Linux内核与驱动程序”,介绍Android内核的特点、Android中使用的专用驱动程序、Android系统可能使用的标准设备驱动。  第4章“Android的底层库和程序”,介绍Android系统的基础程序,以本地程序...

    新版Android开发教程.rar

    的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 • 应用程序框架 支持组件的重用与替换 • Dalvik Dalvik Dalvik Dalvik 虚拟机 专为移动设备优化 • ...

    将本地PC游戏轻松移植到Android的秘技-ch02

    将本地PC游戏轻松移植到Android的秘技, jni, ndk

    精通Android游戏开发

    86 4.7.3 了解游戏生命期 87 4.7.4 响应按键和触控事件 97 4.8 在模拟器上测试asteroids 100 4.9 下一章内容 101 第5章 opengl 3d图形与jni混合 102 5.1 移动设备的强大能力 103 5.2 在java中使用opengl 104 5.2.1 ...

Global site tag (gtag.js) - Google Analytics