Android NDK开发,使用ndk-build编译

(JNIEnv *, jobject);

/JNIEnv 是定义任意native函数的第一个参数(包括调用JNI的RegisterNatives函数注册的函数),指向JVM函数表的指针,函数表中的每一个入口指向一个JNI函数,每个函数用于访问JVM中特定的数据结构。*/

#ifdef __cplusplus
}
#endif
#endif

4,生成. h 头文件时候,如果出现 “找不到类文件” 的错误请参考  blog.youkuaiyun.com/ezconn/arti… 这篇文章

注意:

a. 包名或类名或方法名中含下划线 _ 要用 _1 连接;

b. 重载的本地方法命名要用双下划线 __ 连接;

c. 参数签名的斜杠 “/” 改为下划线 “_” 连接,分号 “;” 改为 “_2” 连接,左方括号 “[” 改为 “_3” 连接;

另外,对于 Java 的 native 方法,static 和非 static 方法的区别在于第二个参数,static 的为 jclass,非 static 的 为 jobject;JNI 函数中是没有修饰符的。

五、在 jni 目录下创建 c 或者 c++ 文件;

文件名可以随意写,但需要注意文件类型;Hello.c 文件(.c 后缀的文件为 C)代表内容是 C 代码;Hello.cpp(.cpp 后缀的文件为 C++)文件代表内容是 C++ 代码;

C++ 代码(注意 C 和 C++ 代码是有区别),以下分别给出 C 和 C++ 两种实现方式:

  • a,Hello.c 文件。在 C 中没有引用,传递的 env 是个两级指针,用(*env)-> 调用方法且方法中要传入 env.

#include <jni.h>
#include “com_ang_ndkdemo_MainActivity.h”
JNIEXPORT jstring JNICALL
Java_com_ang_ndkdemo_MainActivity_fromJNIString(JNIEnv* env, jobject obj) {
return (*env)->NewStringUTF(env,“I am From Native C”);
}

  • b, Hello.cpp 文件。C++ 中 env 为一级指针,用 env-> 调用方法,无需传入 env;C++ 语言在编译的时候为了解决函数的多态问题,会将函数名和参数联合起来生成一个中间的函数名称,而 C 语言则不会,因此会造成链接时找不到对应函数的情况,此时 C 函数就需要用 extern “C” 进行链接指定,这告诉编译器,请保持我的名称,不要给我生成用于链接的中间函数名;exter  “C”{jni 代码}。

#include <com_ang_ndkdemo_MainActivity.h>
#include <stdio.h>

JNIEXPORT jstring JNICALL
Java_com_ang_ndkdemo_MainActivity_fromJNIString(JNIEnv *env, jobject obj)
{
return env->NewStringUTF(“I am From Native C”);
}

Java 的 native 方法是如何链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值