`
hzy3774
  • 浏览: 992351 次
  • 性别: 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开发

    JNI在Android开发中的应用广泛,包括性能优化、调用本地库、游戏开发等场景。以下是对这个"android-JNI开发"主题的详细解释。 1. **JNI基础** - JNI接口提供了Java虚拟机(JVM)和本地代码之间的桥梁,使得开发者...

    serial_jni_largestgle_Androidjni_Android串口操作JNI代码_android_

    总结来说,`serial_jni_largestgle_Androidjni_Android串口操作JNI代码_android_`项目是一个Android应用使用JNI进行串口通信的实例。它涵盖了JNI编程、Android NDK开发、原生代码与Java代码的交互、串口通信协议以及...

    AndroidStudio加载jni

    在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言写的代码进行交互。JNI在很多场景下是必要的,比如优化性能、利用硬件特性、调用C/C++库或者与第三方库集成。Android ...

    Android--JNI-Device.zip_Android jni_android_jni_jni android

    在Android开发中,JNI(Java Native Interface)是一个关键的组件,它允许Java代码与其他语言(如C++或C)编写的代码进行交互。这个“Android--JNI-Device.zip”文件显然是一个关于Android平台上使用JNI与硬件设备...

    Android JNI 用C函数写本地库读写文件,底层调用小例子

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。这个小例子展示了如何使用JNI和C语言来创建一个本地库,用于执行文件的读写操作,从而实现底层的高效...

    android_jni开发文档.rar

    在实际开发中,JNI还涉及到错误处理、内存管理(如使用`JNIEnv`指针进行内存分配和释放)、线程同步、字符串和数组的转换等问题。同时,由于涉及到C/C++,还需要关注内存泄漏和指针操作的正确性,避免引发安全问题。...

    Android使用JNI调用Python so解释器

    总结来说,"Android使用JNI调用Python so解释器"涉及到Android NDK开发,JNI接口设计,Python解释器的Android移植,以及跨语言通信等多个技术层面。这种技术虽然复杂,但能充分利用Python的灵活性和Android的广泛...

    Android下jni开发Demo

    JNI在Android开发中扮演着重要角色,特别是在处理高性能计算、底层库调用、硬件加速和游戏引擎集成等方面。本教程将深入探讨Android下的JNI开发,并通过一个实际的Demo来阐述相关知识点。 1. **JNI基础** - **JNI...

    Androidstudio调用jni的示例

    在Android开发中,JNI(Java Native Interface)是一个关键的组件,允许Java代码和其他语言写的代码进行交互。这个“Androidstudio调用jni的示例”是一个基础教程,旨在帮助初学者理解如何在Android Studio项目中...

    android通过JNI访问硬件LED

    在Android系统中,Java Native Interface (JNI) 是一个关键组件,允许Java代码与其他语言(如C++或C)编写的代码进行交互。本项目聚焦于如何利用JNI来访问硬件资源,特别是控制LED设备。以下是对这个主题的详细阐述...

    android使用jni技术

    本教程将深入探讨如何在Android应用中使用JNI技术。 首先,我们需要理解JNI的工作原理。JNI提供了一种方式,使得Java代码可以调用本地(非Java)函数,同时本地代码也可以调用Java方法。这通常是通过创建本地方法...

    Android中调用JNI例子

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下被使用,如优化性能、使用硬件特性、调用C/C++库等。本示例将详细介绍如何在Android...

    android jni 里面使用NewGlobalRef

    在Android的JNI(Java Native Interface)开发中,`NewGlobalRef`是一个至关重要的函数,它允许我们在本地C/C++代码中创建对Java对象的全局引用。这个知识点涉及到Android应用的跨语言交互,内存管理和生命周期管理。 ...

    安卓串口Socket通讯USB驱动jni相关-Android中调用JNI例子.rar

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。这个压缩包“安卓串口Socket通讯USB驱动jni相关-Android中调用JNI例子.rar”似乎包含了一个示例项目,...

    Android Studio JNI_NDK开发实例

    Android Studio JNI_NDK开发实例是Android应用开发中的一个重要领域,涉及到Java与原生代码(C/C++)的交互。JNI(Java Native Interface)是Java平台的一部分,它允许Java代码和其他语言写的代码进行交互。NDK...

    Android中JNI实现AES加密源代码

    在Android开发中,JNI(Java Native Interface)是一个关键的技术,它允许Java代码和其他语言写的代码进行交互。JNI常用于提高应用程序性能,访问特定硬件功能,或者像本例中所示,执行安全操作,如AES加密。AES...

    Android Studio JNI开发入门教程

    总之,JNI和NDK在Android开发中提供了与原生代码交互的能力,它们结合使用可以帮助开发者提升应用性能,利用现有C/C++库,以及解决特定的技术挑战。在实践中,理解JNI和NDK的工作原理以及如何有效利用它们是至关重要...

    Android下JNI和HAL技术

    在Android系统中,Java的应用层和框架层主要使用Java语言进行开发,而Android底层却是基于Linux的,这就需要一种机制来实现Java与C/C++的通信,JNI就是这种机制的实现。 JNI在Android系统中的应用非常广泛,尤其在...

    android 使用jni调用c++

    在Android开发中,JNI(Java Native Interface)是一个关键特性,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都非常有用,比如利用C++的高性能处理图像、音频或者进行复杂的数学运算,以及接入原生...

Global site tag (gtag.js) - Google Analytics