Eclipse下的Android JNI 开发

1 创建Android工程

首先建立一个名为AndroidJniTest的Android工程,包名默认为com.example.androidjnitest,src目录下自动创建MainActivity.java。

2 设计JNI接口

创建新的文件包com.example.jni,并在改包下新建一个TestJNI.java的类。

打开TestJNI.java,我们将在这个文件里创建一个JNI接口类,该Java类提供一个加法运算的接口:

public class TestJNI {
public native boolean init();
public native int add(int x , int y);
public native void destory();
}

注意,这里的函数声明要加上native关键字。

3 编译JNI

将TestJNI.java文件复制到工程的bin目录下,在终端中进入该工程的bin目录,输入javac TestJNI.java,这时会生成一个TestJNI.class文件。

在bin文件夹下,如果没有则创建目录:/com/example/jni,并把TestJNI.class复制到/bin/com/example/jni目录下。然后在终端里进入工程的bin目录,输入javah -jni com.example.jni.TestJNI,此时会生成一个com_example_jni_TestJNI.h文件。

com_example_jni_TestJNI.h文件就是对应于上面定义的Java接口的C/C++头文件。打开这个文件,可以看到系统已经为我们自动完成了接口函数的声明:

这三个函数分别对应于JNI的三个接口函数,命名方式只是在前面加上了Java包名。

4 用C/C++实现JNI

有了JNI的C/C++头文件,就可以在C层实现JNI接口了。首先在工程目录下创建一个jni目录,这个目录就是专门用来放C/C++代码的。把com_example_jni_TestJNI.h文件复制到jni目录下,并在这里创建一个com_example_jni_TestJNI.cpp文件。

由于我想用C++来实现JNI,所以上面两个文件我只是用来作为动态链接库的接口,具体的实现我希望放在一个类里面来完成,因此我再添加两个文件:Add.h和Add.cpp。

下面我们就来实现CAdd类和JNI接口。首先实现CAdd类:

CAdd.h

#ifndef JNI_TEST_ADD
#define JNI_TEST_ADD
class CAdd{
public:
CAdd();
~CAdd();
int add(int x, int y);
};
#endif

CAdd.cpp

#include "Add.h"
CAdd::CAdd(){
}
CAdd::~CAdd(){
}
int CAdd::add(int x, int y){
return x+y;
}

然后我们来写com_example_jni_TestJNI.cpp,实现JNI:

#include <stdlib.h>
#include <stdio.h>
#include "Add.h"

CAdd *pCAdd = NULL;

JNIEXPORT jboolean JNICALL Java_com_example_jni_TestJNI_init
  (JNIEnv *env, jobject obj){
if(pCAdd==NULL){
pCAdd = new CAdd ;
}
return pCAdd!=NULL;
}

JNIEXPORT jint JNICALL Java_com_example_jni_TestJNI_add
  (JNIEnv *env, jobject obj, jint x, jint y){
jint res = -1;
if(pCAdd!=NULL){
res = pCAdd->add(x,y);
}
return res;
}

JNIEXPORT void JNICALL Java_com_example_jni_TestJNI_destory
  (JNIEnv * env, jobject obj){
if(pCAdd!=NULL){
delete pCAdd;
pCAdd=NULL;
}
}

到此我们的C/C++部分就全部实现了。

5 创建mk文件

JNI实现了之后就要把C/C++代码编译成动态链接库.so文件,这样Java程序才能调用JNI的接口。要编译so文件,需要写Android.mk和Application.mk两个文件。我们先来写Android.mk。

先在工程目录的jni下创建一个Android.mk文件:

然后打开文件在里面输入如下内容:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS) 

LOCAL_MODULE    := TestJNI
LOCAL_SRC_FILES := com_example_jni_TestJNI.cpp
LOCAL_SRC_FILES += Add.cpp

include $(BUILD_SHARED_LIBRARY)

其中LOCAL_PATH是C/C++代码所在目录,也就是我们的jni目录。

LOCAL_MODULE是要编译的库的名称。编译器会自动在前面加上lib,在后面加上.so。

LOCAL_SRC_FILES是要编译的C/C++文件。

现在我们在工程的根目录下创建一个Application.mk文件,并输入如下内容:

APP_PROJECT_PATH := ${call my-dir}
APP_MODULES := TestJNI 

6 编译动态链接库

写完了mk文件就可以开始编译C/C++代码了。

默认在Windows7下配置好了NDK开发环境,打开cygwin,进入到工程目录。

在终端里进入工程的根目录,输入命令“$NDK/ndk-build”命令即可编译

编译成功后会在工程目录的libs/armeabi目录下生成一个libTestJNI.so文件。

7 在Java中调用JNI

现在我们的Android应用可以调用JNI计算加法的代码,如下:

static {
System.load("TestJNI");
}
TextView tvX = null;
TextView tvY = null;
TextView tvSum = null;
Button   btnAdd = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvX = (TextView)findViewById(R.id.et_x);
tvY = (TextView)findViewById(R.id.et_y);
tvSum = (TextView)findViewById(R.id.et_sum);
btnAdd = (Button)findViewById(R.id.btn_add);
btnAdd.setOnClickListener(new OnClickListener(){

@Override
public void onClick(View v) {
int x = Integer.valueOf( tvX.getText().toString());
int y = Integer.valueOf( tvY.getText().toString());
int sum = 0;
TestJNI jni = new TestJNI();
boolean flag = jni.init();
if(flag){
sum = jni.add(x, y);
}
btnAdd.setText(String.valueOf(sum));
}
});
}

程序运行结果:

时间: 2024-11-05 12:31:36

Eclipse下的Android JNI 开发的相关文章

eclipse下搭建Android开发环境:Android6(API 23)+ADT23.07

eclipse下install Android ADT时,在线安装的方式太慢.如果想要Android6.0(API 23)开发环境,那么eclipse需要ADT23.07版本的支持,本地安装的情景下给大家附上离线安装包 链接:http://pan.baidu.com/s/1o6RAyAA 密码:4c7b (内附API 19  ,API 23  ,ADT23.03  ,ADT23.06  ,ADT23.07)

Ubuntu下编译Android JNI实例全过程

第一步:保证make和gcc可用 在shell中输入make-v,不报错就是对的.(可参考http://wenku.baidu.com/view/d87586c24028915f804dc24a.html.) 在shell中输入gcc-v,不报错就是对的. 第二步:安装NDK 下载NDK后,设置环境变量: 将android-ndk的路劲加到环境变量PATH中:sudogedit /etc/environment 然后再让这个更改的环境变量立即生效:source /etc/environment

C++开发安卓、windows下搭建Android NDK开发环境

1. NDK(Native Development Kit) 1.1 NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP功能开发的工具,通过这个工具,我们可以把用C/C++代码编译成可以直接运行在Android平台上的本地代码,这些本地代码以动态链接库( *.so )的形式存在,也正因为这样,我们可以通过复用这些动态链接库从而复用本地代码. 那么,通过NDK这个开发工具包,那么我们是否可以将一个APK完全使用C/C++来编写呢? 答案是不可

ubuntu下进行android的开发(二):android开发环境搭建

android开发环境搭建主要分两个步骤:安装JDK及安装集成开发环境. 一.安装JDK ubuntu系统自带的有openJDK,要开发android还是需要去官网下载JDK(1.6以上).当前系统JDK版本可以通过java -version指令来查看. 到oracle官网http://www.oracle.com/technetwork/java/javase/downloads/index.html下载最新的JAVA SE开发环境(JDK),我这里下载的是jdk-8u11-linux-x64

Android jni开发有哪些常见的错误

我们在Android jni开发中,特别是对于刚入门学习Android jni开发的同学来说,往往会遇到很多错误,这里总结了我们经常遇见的错误.这些错误,你是否经常遇到. 错误1:java.lang.UnsatisfiedLinkError: Native method not found: 本地方法没有找到 1.本地函数名写错 2.忘记加载.so文件 没有调用System.loadlibrary 错误2:findLibrary returned null 1.System.loadLibrar

Android官方开发文档之从Eclipse迁移到Android Studio开发篇

Android官方开发文档之从Eclipse迁移到Android Studio开发篇 1.前言 从Eclipse迁移项目到Android Studio需要适应一个新的项目结构,建立系统和IDE的功能.为了简化迁移过程,Android Studio提供了重要工具使你可以快速地将现有代码移动到Android Studio项目基础建设的文件和工具. 2.Android Studio的基础(Android Studio Basics) 当你将Eclipse项目迁移到Android Studio时,你应该

Eclipse 下搭建pyDev python开发环境及helloworld

一,安装基础环境 1,安装jdk7,并配置环境变量(pyDev要求jdk7及以上版本,否则安装好也不显示) 2,下载Eclipse并解压 3,安装python3.X 二,Eclipse下配置pyDev 1,安装插件:help -> Install new Software.. ->输入PyDev Update Site - http://pydev.org/updates 然后下一步.同意等等. 2,配置python编译器:Window -> perferences -> pyDe

ubuntu下进行android的开发(一):远程开发环境搭建

ubuntu系统的安装不再记录,已经有了太多的介绍.下面主要记录一些安装后环境的搭建以及一些问题的解决办法. 1.git工具的安装 因为要使用git工具来管理源码,所以安装系统后首先要安装git工具.打开终端执行下面的命令即可. sudo apt-get install qgit 2.使用ssh远程登录服务器进行开发 登录指令:ssh [-x] [email protected]_address(eg:192.18.0.12)   -------这里-X表示支持图形界面,gedit打开和另存都在

Android JNI开发提高篇

有关JNI的开发技术,我们继续围绕Android平台进行,JNI可以支持C或C++,从目前为止我们写过的JNI代码均为C实现的,即文件名为.C而C++的和这些有什么不同呢? Android平台上的JNI一般使用C还是C++编写呢? Android平台在中间层和大部分的类库的底层使用了C++的开发方式,后缀为.cpp,比如Android Framework.OpenCore.Webkit.SQLite等等.使用C++好处就是可以使用很多库但目前Android不支持STL,我们知道C表示字符串都是字