_进入到源码目录下执行命令
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
本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。