ndk-build JNI头文件错误 error: unknown type name 'JNIEXPORT'

在用 ndk-build编译生成.so文件的时候报一下错误,记录一下:

G:\支付宝_支付\WS_APP_PAY_SDK_BASE_2.0\WS_APP_PAY_SDK_BASE_2.0\客户端Demo\AndroidDemo_2.0(SDK_15.2.8)\
AndroidDemo_2.0(SDK_15.2.8)\AndroidDemo_2.0\alipay_demo\jni>ndk-build
"Compile thumb : JNITest <= com_alipay_sdk_pay_demo_JniTest.c
G:/支付宝_支付/WS_APP_PAY_SDK_BASE_2.0/WS_APP_PAY_SDK_BASE_2.0/客户端Demo/AndroidDemo_2.0(SDK_15.2.8)/AndroidDemo_2.0(SDK_15.2.8)/
AndroidDemo_2.0/alipay_demo//jni/com_alipay_sdk_pay_demo_JniTest.c:4:1:
error: unknown type name 'JNIEXPORT'
G:/支付宝_支付/WS_APP_PAY_SDK_BASE_2.0/WS_APP_PAY_SDK_BASE_2.0/客户端Demo/AndroidDemo_2.0(SDK_15.2.8)/AndroidDemo_2.0(SDK_15.2.8)/
AndroidDemo_2.0/alipay_demo//jni/com_alipay_sdk_pay_demo_JniTest.c:4:19:
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'JNICALL'
G:/支付宝_支付/WS_APP_PAY_SDK_BASE_2.0/WS_APP_PAY_SDK_BASE_2.0/客户端Demo/AndroidDemo_2.0(SDK_15.2.8)/AndroidDemo_2.0(SDK_15.2.8)/
AndroidDemo_2.0/alipay_demo//jni/com_alipay_sdk_pay_demo_JniTest.c:4:19:
error: unknown type name 'JNICALL'
make: *** [G:/_/WS_APP_PAY_SDK_BASE_2.0/WS_APP_PAY_SDK_BASE_2.0/Demo/AndroidDemo_2.0(SDK_15.2.8)/AndroidDemo_2.0(SDK_15.2.8)/
AndroidDemo_2.0/alipay_demo//obj/local/armeabi/objs/JNITest/com_alipay_sdk_pay_demo_JniTest.o] Error 1


在网上找了一会,最终找到问题所在,我的.c文件缺少头文件  #include <jni.h>导致,加上之后就OK了。




感谢博主:http://blog.csdn.net/yourijing/article/details/50830873

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是详细的步骤: 1. 准备工作 在开始之前,需要确保系统中已经安装了 JDK 和 Android NDK,并且已经配置好了环境变量。 2. 创建 C++ 库文件 在任意目录下创建一个 C++ 文件,例如 `native-lib.cpp`,并编写相应的 C++ 代码。 3. 创建 JNI 接口函数 在 C++ 文件中创建 JNI 接口函数,例如: ```c++ #include <jni.h> #ifdef __cplusplus extern "C" { #endif JNIEXPORT jstring JNICALL Java_com_example_NativeUtils_getMessage(JNIEnv *env, jobject thiz) { const char *message = "Hello from C++!"; return env->NewStringUTF(message); } #ifdef __cplusplus } #endif ``` 其中,`Java_com_example_NativeUtils_getMessage` 是 JNI 接口函数,`getMessage` 是 Java 层调用的方法名,`com_example_NativeUtils` 是 Java 类的全限定名。 4. 编译 C++ 库文件 使用 NDK 自带的工具链将 C++ 文件编译成动态链接库,例如: ```shell gcc -shared -fpic -o libnative-lib.so native-lib.cpp ``` 其中,`-shared` 选项表示编译成动态链接库,`-fpic` 表示编译为位置独立代码,`-o` 指定输出文件名。 5. 创建 Java 类 在 Android Studio 中创建一个 Java 类,例如: ```java public class NativeUtils { static { System.loadLibrary("native-lib"); } public static native String getMessage(); } ``` 其中,`loadLibrary` 方法用于加载本地库,`getMessage` 方法对应本地方法。 6. 生成头文件 使用 JDK 自带的工具 javah 生成 JNI 头文件,例如: ```shell javah -classpath <项目路径>/app/build/intermediates/classes/debug -d <jni头文件输出路径> com.example.NativeUtils ``` 其中,`<项目路径>` 表示项目的绝对路径,`<jni头文件输出路径>` 表示 JNI 头文件的输出路径,`com.example.NativeUtils` 表示 Java 类的全限定名。 7. 实现 JNI 接口函数 在 JNI 头文件中实现 JNI 接口函数,例如: ```c++ #include <jni.h> JNIEXPORT jstring JNICALL Java_com_example_NativeUtils_getMessage(JNIEnv *env, jclass clazz) { const char *message = "Hello from C++!"; return env->NewStringUTF(message); } ``` 其中,`Java_com_example_NativeUtils_getMessage` 是 JNI 接口函数,`getMessage` 是 Java 层调用的方法名,`com_example_NativeUtils` 是 Java 类的全限定名。 需要注意的是,JNI 接口函数的第一个参数是 `JNIEnv` 指针,第二个参数是 `jclass` 或 `jobject` 指针,分别表示当前调用的 Java 类或 Java 对象。 8. 将 JNI 库文件加入 Android 项目 将编译好的动态链接库文件复制到 Android 项目的 `app/src/main/jniLibs/<架构>` 目录下,其中 `<架构>` 表示目标设备的架构,例如 `arm64-v8a`。 9. 在 Android 项目中调用 JNI 方法 在 Android 项目中调用 JNI 方法,例如: ```java String message = NativeUtils.getMessage(); ``` 10. 编译运行 Android 项目 编译并运行 Android 项目,即可在应用中使用 C++ 封装的 JNI 接口函数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风堂主人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值