Android 下 JNI 开发

_进入到源码目录下执行命令

 

 D:\jni_workspace\JNIHelloWorld\bin\classes>

 

 执行命令:javah  com.atguigu.jnihellworld.MainActvity

 或者:com.atguigu.jnihellworld.MainActvity

 

执行后生成文件:com_atguigu_jnihelloworld_MainActivity.h如图

文件内容如下:

 

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class com_atguigu_jnihelloworld_MainActivity */

 

#ifndef _Included_com_atguigu_jnihelloworld_MainActivity

#define _Included_com_atguigu_jnihelloworld_MainActivity

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     com_atguigu_jnihelloworld_MainActivity

 * Method:    hello_111_2_5_hehe_From_C

 * Signature: ()Ljava/lang/String;

 */

JNIEXPORT jstring JNICALL Java_com_atguigu_jnihelloworld_MainActivity_hello_1111_12_15_1hehe_1From_1C

  (JNIEnv *, jobject);

 

#ifdef __cplusplus

}

#endif

#endif

 

 

 

5_拷贝com_atguigu_jnihelloworld_MainActivity.h到工程jni目录;

6_创建一个新的文件Hello2.c,把生成的方法拷贝过来内容如下:

#include<stdio.h>

#include<stdlib.h>

#include<jni.h>//这个头文件必须得有。里面包含jni对应的方法和类型;

 

JNIEXPORT jstring JNICALL Java_com_atguigu_jnihelloworld_MainActivity_hello_1111_12_15_1hehe_1From_1C

  (JNIEnv *env, jobject obj){

    char* text = "I am from c hello afu hello2.c";

    return (*env)->NewStringUTF(env,text);

}

 

7_修改Android.mk文件引用成Hello2.c

 

  LOCAL_SRC_FILES := Hello2.c

 

 

 

注意: 不同版本的JDK操作方式不同.

 

命令: javah <包名+类名>

 

JDK1.6使用方式

    在当前工程的bin/classes目录下, 执行javah命令.

JDK1.7使用方式

    在工程的src目录下, 执行javah命令.

 

javah cn.atguigu.ndk2.DemoActivity

 

05_JNI开发常见错误-30

 重新创建一个工程演示CommonErrorDemo

1.缺少Android.mk文件报错:

Android NDK: Your APP_BUILD_SCRIPT points to an unknown file: ./jni/Android.mk

 

解决方案:在jni目录下创建一个Android.mk文件

 

2. c文件没有include导入jni.h的头文件, 导致某些类型找不到.

 

"Compile thumb : atguigu31 <= Hello.c

  jni/Hello.c:4:1: error: unknown type name 'JNIEXPORT'

  jni/Hello.c:4:19: error: expected '=', ',', ';', 'asm' or '__attribute__' before

  'JNICALL'

 jni/Hello.c:4:19: error: unknown type name 'JNICALL'

3. 方法的形参没有指定名称. 加上名字就可以了.

 

  jni/Hello.c:6:3: error: parameter name omitted

 

4. 没有加载动态库.so文件.

No implementation found for native

Lcom/atguigu/commonerrordemo/MainActivity;.helloFromC ()Ljava/lang/String;

 

5. 加载动态链接库错误, 名字写错. 加载时一定要写: Android.mk文件中的LOCAL_MODULE对应的名字.

 

    Caused by: java.lang.UnsatisfiedLinkError: Couldn't load libatguigu31.so: findLibrary returned null

 

 

本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值