[Android]NDK开发环境配置与JNI开发

本文详细介绍了在Windows环境下,如何配置Android NDK开发环境,包括NDK的下载与环境变量设置,Eclipse中NDK和CDT插件的安装。接着,通过创建安卓项目、编写Java代码并生成头文件,实现C++层的JNI函数,最后编译生成.so文件,并在其他项目中调用JNI方法,提供了一个完整的JNI开发流程示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文的目标是实现NDK开发环境的配置以及学习JNI开发流程。

1.环境配置

本文的开发环境为win10 64位+Eclipse+Android ADT+NDK+CDT。

2.安装:

这里只介绍NDK和CDT的安装。

2.1从链接:http://dl.google.com/android/repository/android-ndk-r11c-windows-x86_64.zip下载NDK开发包,然后解压到本地路径,并拷贝本路径(比如我的是:D:\android-sdk\android-ndk-r11c-windows-x86_64\android-ndk-r11c)。

2.2配置系统的环境变量,操作路径为:高级系统设置–>环境变量–>找到PATH–>新建即可,如下图所示:
这里写图片描述

2.3为Eclipse添加NDK路径,操作路径为:Windows–>Preference–>NDK,如下图所示:
这里写图片描述

2.4为Eclipse安装CDT插件添加c/c++环境支持,安装连接:cdt - http://download.eclipse.org/tools/cdt/releases/8.8.1。操作路径为:help–>Install New Software,如下图所示:
这里写图片描述

3.完成了第二步,接下来进行代码编写

3.1新建一个安卓项目,并在项目的根目录下新建jni文件夹,如下图所示:
这里写图片描述

3.2在string.pub.jni.test包下新建TestJni.java类,添加如下代码:

package string.pub.jni.test;

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

3.3将上一步创建的类文件拷贝到bin目录下,然后从命令行界面cd到..\AJniDemo\bin目录下运行javac TestJni.java,完成后可以看到在bin目录下生成的TestJni.class文件了。之后在..\bin目录下按照包名的顺序新建文件夹,路径为..\bin\string\pub\jni\test,将TestJni.class拷贝到..\bin\string\pub\jni\test目录下,在命令行界面执行javah -jni string.pub.jni.test.TestJni可以看到在..\bin目录下生成了string_pub_jni_test_TestJni.h这个头文件。将生成的头文件拷贝到项目的jni目录下,如下图所示:
这里写图片描述

3.4上一步生成了所需要的头文件,这一步开始实现c++层的代码了。按照上一步新建图中的文件,然后右键项目–>Android Tools–>Add Native Support。所需要的代码如下:

//Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := TestJNI
LOCAL_SRC_FILES := string_pub_jni_test_TestJni.cpp
LOCAL_SRC_FILES += CAdd.cpp

include $(BUILD_SHARED_LIBRARY)
//Application.mk
APP_PROJECT_PATH := ${call my-dir}
APP_BUILD_SCRIPT=$(APP_PROJECT_PATH)/Android.mk
APP_MODULES := TestJNI

APP_ABI := armeabi armeabi-v7a x86
//CAdd.cpp
#include "CAdd.h"
CAdd::CAdd(){
}
CAdd::~CAdd(){
}
int CAdd::add(int x, int y){
return x+y;
}
//CAdd.h
#ifndef JNI_TEST_ADD
#define JNI_TEST_ADD
class CAdd{
public:
CAdd();
~CAdd();
int add(int x, int y);
};
#endif
//string_pub_jni_test_TestJni.cpp
#include <stdlib.h>
#include <stdio.h>
#include "CAdd.h"
#include "jni.h"

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

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

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

3.5命令行界面下,在项目根目录下执行:ndk-build,成功之后刷新项目,就可以看到在Libs下面生成了.so文件。如下图所示:
这里写图片描述

4.调用JNI方法:

4.1将3中生成的.so文件拷贝到别的项目的libs文件夹下,然后新建下图所示的包和类:
这里写图片描述
4.2在TestJni.java中添加如下代码:

package string.pub.jni.test;

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

4.3在其他地方调用JNI方法,如下所示:

import string.pub.jni.test.TestJni;

public class MainActivity extends Activity {

    static{
        System.loadLibrary("TestJNI");
    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TestJni test=new TestJni();
        int ii=test.add(22, 2);
        Toast.makeText(getApplicationContext(), ""+ii, Toast.LENGTH_SHORT).show();
    }

以上,就是一个简单的JNI开发实例。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值