博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 下 JNI 开发
阅读量:4046 次
发布时间:2019-05-25

本文共 2203 字,大约阅读时间需要 7 分钟。

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

 

 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

 

 

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

你可能感兴趣的文章
gdb调试命令的三种调试方式和简单命令介绍
查看>>
C++程序员的几种境界
查看>>
VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法
查看>>
VUE-Vue.js之$refs,父组件访问、修改子组件中 的数据
查看>>
Vue-子组件改变父级组件的信息
查看>>
Python自动化之pytest常用插件
查看>>
Python自动化之pytest框架使用详解
查看>>
【正则表达式】以个人的理解帮助大家认识正则表达式
查看>>
性能调优之iostat命令详解
查看>>
性能调优之iftop命令详解
查看>>
非关系型数据库(nosql)介绍
查看>>
移动端自动化测试-Windows-Android-Appium环境搭建
查看>>
Xpath使用方法
查看>>
移动端自动化测试-Mac-IOS-Appium环境搭建
查看>>
Selenium之前世今生
查看>>
Selenium-WebDriverApi接口详解
查看>>
Selenium-ActionChains Api接口详解
查看>>
Selenium-Switch与SelectApi接口详解
查看>>
Selenium-Css Selector使用方法
查看>>
Linux常用统计命令之wc
查看>>