JNI & NDK 实例讲解二 (通过NDK创建JNI项目)

本文详细介绍了如何在Eclipse环境下搭建Android NDK开发环境,并通过具体步骤指导读者完成一个简单的JNI项目的创建,包括配置NDK环境、编写C/C++代码、生成JNI头文件等关键环节。

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

          上一篇博客中有讲解关于JNI NDK是什么以及他们之间的关系。并且通过原始方式讲解了一个JNI项目的创建过程。那么这一篇博客我们将讲解NDK的开发环境的搭建,及如何通过NDK来开发一个JNI项目。

          首先我们来看下如何在Eclipse下搭建一个NDK开发环境(现在Android studio越来越流行,其很多功能也比Eclipse强大,有时间再补上Android studio 下NDK开发,我也会提供有关Android studio配置开发讲解的博客)。

         1:首先需要下载NDK,下载地址为:http://developer.android.com/tools/sdk/ndk/index.html。如果不能访问,可以联系我,本来有上传个如何访问国外网址的方法,但是优快云貌似不允许上传。

         2:下载下来后是个exe程序,我的为android-ndk-r10e-windows-x86_64.exe,双击即可解压出文件夹android-ndk-r10e。然后把这个文件夹放到你想要放的磁盘目录下。

         3:打开Eclipse,新建一个Android项目,命名为NdkTestJNI。

         4:在项目NdkTestJNI右键->New->Folder,输入文件名jni- 》Finish。

         5:现在需要给NdkTestJNI配置NDK开发环境。

                在Eclipse里Project->Properties->Builders->New->在弹出的【Choose configuration type】对话框里面双击Program->在弹出的【Edit Configuration】对话框中,

                                                   

                  切换至Main这个tab:

                        1:Name输入NDK(任意取)

                        2:Location栏目点击Browse File System,选择你之前解压出的NDK文件夹的位置。

                        3:Working Directory栏目点击Browse Workspace,选中刚刚创建的android项目NdkTestJNI。

                       

                   切换至Refresh:

                        1:选择“Refresh resources upon completion” 
                        2:选择“The entire workspace”
                        3:选择“Recuresively include sub-folders”

                         

                   切换至Build Options:

                       1:选择“After a “Clean””
                       2:选择“During manual builds”
                       3:选择“During auto builds”
                       4:选择“Specify working set of relevant resources” 
                       5:点击Specify Resources,在弹出的对话框中勾选刚刚创建的android项目NdkTestJNI

                        

                       

                 最后点ok,就配置好了


          6:在项目里添加类jniFunction,并添加一个和上一篇博客一样的native函数。

package com.example.ndktestjni;

public class jniFunction {
	public native int add(int a, int b);  //native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。java编译器遇到native函数时,不会关心该函数的具体实现。
}
          7:命令行进入jniFunction.java目录,并用javac jniFunction.java生成jniFunction.class文件。具体生成方式见 上一篇博客。然后与上一篇博客讲的生成.h文件方式有点不同。在这个android项目中需要命令行退至src目录下然后 javah com.example.ndktestjni.jniFunction(javah 包名路径.class名)。不明白生成方式的见 上一篇博客

          8:  把生成的.h文件com_example_ndktestjni_jniFunction.h拷贝到刚创建在项目里的jni目录下,在jni目录上右键->New->File,输入文件名com_example_ndktestjni_jniFunction.c。加入代码:

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


JNIEXPORT jint JNICALL Java_com_example_ndktestjni_jniFunction_add
  (JNIEnv *env, jobject arg, jint a, jint b)
{

	int result = (int)(a+b);

	return result;

}


        9:在jni目录上右键->New->File,输入文件名Android.mk 不能取别的名字 ,加入

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := NdkTestJNI
LOCAL_SRC_FILES := com_example_ndktestjni_jniFunction.c
include $(BUILD_SHARED_LIBRARY)
        10:最后再android项目MainActivity中加入如下代码:
package com.example.ndktestjni;

import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends Activity {

	static
	{
		System.loadLibrary("NdkTestJNI"); //引入c++库
	}
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        int a = jniFunction.add(1,2); //调用JNI函数
        Toast.makeText(this, ""+a, 100).show();
    }
}
        11:到此这个通过NDK创建JNI项目就完成了,我们和前一篇博客对比,发现通过NDK创建JNI项目,只要把环境搭好:

                  1:那么直接可以在这个Android项目中编写c/c+代码,不需要去c/c++开发工具中另建项目编写

                  2:还有是不需要像之前那样每次编译c/c++代码,都需要重新把dll拷贝到Java目录下

                  3:能自动将so库和java应用一起打包成apk

好了,通过NDK创建JNI项目就讲到这里吧。

        源码下载

JNI & NDK 实例讲解一 (不通过NDK创建JNI项目)

JNI & NDK 实例讲解二 (通过NDK创建JNI项目)

在Android中,JNI (Java Native Interface)NDK (Native Development Kit) 是两个重要的工具,它们允许开发者将用C/C++编写的高性能代码直接集成到Java应用中。动态注册 Native 方法意味着你可以在运行时而不是编译时就决定哪些native函数需要加载。 动态注册通常发生在以下几个步骤: 1. **创建Native函数**:在C/C++代码中编写函数,这些函数会被Java访问。函数名通常是&quot;Java_com_your_package_Name_ofYourClass_methodName&quot;的形式,用于与Java方法关联。 2. **注册Native函数**:在Android的JNI_OnLoad函数中,你需要手动注册这些函数。例如,使用`JNIRegisterNatives` API 来声明并注册所有的native方法。 ```c++ static const JNINativeMethod gMethods[] = { {&quot;methodName&quot;, &quot;(JNIEnv *, jobject)&quot;, reinterpret_cast&lt;void*&gt;(your_native_function_ptr)} }; int register NativeMethods(JNIEnv* env, const char* className) { return env-&gt;RegisterNatives(className, gMethods, NELEM(gMethods)); } ``` 3. **从Java调用Native函数**:在Java端,你可以像调用普通Java方法一样调用这些native函数。首先需要获取到JNIEnv对象,然后通过`callStaticVoidMethod`或`callVoidMethod`等方法调用。 4. **注意事项**: - 动态注册需要小心处理内存管理,尤其是对于静态全局变量和JNI本地引用,因为它们会在JNI_OnUnload时自动销毁。 - 如果在运行时频繁注册/卸载Native函数可能会导致性能开销。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值