Android JNI 入门

本文介绍如何在Android项目中使用JNI(Java Native Interface),通过具体示例详细讲解从Java声明native方法到C/C++实现的过程,并演示如何加载和使用.so库。

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

Android JNI (Java Native Interface)就是为了实现java 与其他语言相互调用的语言。当然在Android就是为了跟C,C++的调用。在Linux ,Mac中Java最后调用的就是.so的文件,在Window中就是.dll文件。

那么Java到C怎么对应起来?调用Java的哪个方法就是C中的哪个方法呢?通过在Java类中声明native的方法就开始了。

新建一个Android工程HelloNDK。新建一个类GetString

public class GetString {
	public static native String GetString();
	public static native String GetString(int a,int b);
	public static native String getWord();
}
具体的步骤如下:

1、在Java中声明native()方法,然后编译(javac); 

2、用javah产生一个.h文件; 

3、编写包含.h文件的c文件

4、编译c文件

5、使用编译成功的so文件。

在我建立Android Project中是怎么实现的?其实在工程的bin/classes/目录下(classes是隐藏的)就第一步就编译好了,所以我们在这目录下进行第二步,命令为:

javah -jni com.example.hellondk.GetString(包+类)

就会生成com.example.hellondk.GetString.h 头文件,只要你NDK目录配置好了,接下来就是右键工程在Android Tool中选Add Native Support 看到工程名点finish。

接下来就在工程下看到多了jni这个文件夹。里面有Android.mk,还有同工程名的.cpp文件。

把刚才生成的.h文件拷贝到jni文件夹下。

编写c文件呢先要看下.h头文件里面写的是什么

* Class:     com_example_hellondk_GetString
 * Method:    GetString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__
  (JNIEnv *, jclass);

/*
 * Class:     com_example_hellondk_GetString
 * Method:    GetString
 * Signature: (II)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__II
  (JNIEnv *, jclass, jint, jint);

/*
 * Class:     com_example_hellondk_GetString
 * Method:    getWord
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_getWord
  (JNIEnv *, jclass);

方法名称很吓人,不过看下就知道Java跟C的方法就这样对应起来了。JNIEnv等其他参数以后再讲

接下来是实现在.cpp文件中实现这些方法。复制过去

#include "com_example_hellondk_GetString.h"

/*
 * Class:     com_example_hellondk_GetString
 * Method:    GetString
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__
  (JNIEnv * env, jclass){
	return env->NewStringUTF("hello ndk");
};

/*
 * Class:     com_example_hellondk_GetString
 * Method:    GetString
 * Signature: (II)Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellondk_GetString_GetString__II
  (JNIEnv * env, jclass, jint a, jint b){
	return env->NewStringUTF("result a+b="+(a+b));
};

JNIEXPORT jint JNICALL Java_com_example_hellondk_GetInt_getInt
  (JNIEnv * env, jclass, jint a){
	return a;
};

简单的返回输出。

那现在怎么使用呢?其实我们还可以看到在工程的libs目录下生成了armeabi文件夹下生成了libHelloNDK.so库文件。这个就是我们要使用的.so库文件啦

在MainActivity中

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

就可以了。接下就可以直接用GetString的方法,这样就实现了Java-->C了。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值