`
mapdigit
  • 浏览: 239564 次
文章分类
社区版块
存档分类
最新评论

Android NDK 开发教程三:Hello JNI 示例

 
阅读更多

Android NDK 开发包带有不少例子,一个简单的例子Hello-Jni ,介绍了如何使用Java调用C函数。

1. 可以使用Eclipse的import 将该项目添加到工作目录中.

该项目目录结构如下:

├── AndroidManifest.xml
├── default.properties
├── hellojni.txt
├── jni
│ ├── Android.mk
│ └── hello-jni.c

├── res
│ └── values
│ └── strings.xml
├── src
│ └── com
│ └── example
│ └── hellojni
│ └── HelloJni.java
└── tests
├── AndroidManifest.xml
├── default.properties
└── src
└── com
└── example
└── HelloJni
└── HelloJniTest.java

上面列出使用NDK开发项目的基本的目录结构,C代码一般放在jni目录下。

2. 编译Native Code

i) 在命令行(Windows 环境下使用Cygwin的命令行) ,将当前目录改动到 <ndk-root>/samples/hello-jni

ii) 生成build.xml

android update project -p . -s (注:Windows下可能需要 使用android.bat )

iii) 编译C代码

cd <ndk-root>/samples/hello-jni

<ndk_root>/ndk-build

3. 下面就可以使用Eclipse 编译运行 Hello Jni.

编写NDK的一般步骤,

1. 参考Hello-Jni ,修改jni/Android.mk 文件,将所要编译的文件改成自己的文件。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

2. 定义Native函数,如HelloJni 中

public native String stringFromJNI();

3. 在Eclipse中编译该项目,注意此时,你无需定义对于的Native文件中C函数,因为手工定义对于的C函数很容易出错,可以借助javah 工具来完成(包括在JDK中)。

4. 使用Javah 生成对应C函数定义

在命令行下 运行 javah com.example.hellojni.HelloJni

其中com.example.hellojni 为包名,注意运行Javah 的当前目录 为 <ndk>/examples/hello-jni/bin/classes (你也可以使用javah 的选项来指定classpath).

正确运行好,Javah产生 com_example_hellojni_HelloJni.h

定义如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_hellojni_HelloJni */
 
#ifndef _Included_com_example_hellojni_HelloJni
#define _Included_com_example_hellojni_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_hellojni_HelloJni
 * Method:    stringFromJNI
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_stringFromJNI
 (JNIEnv *, jobject);
 
/*
 * Class:     com_example_hellojni_HelloJni
 * Method:    unimplementedStringFromJNI
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_hellojni_HelloJni_unimplementedStringFromJNI
 (JNIEnv *, jobject);
 
#ifdef __cplusplus
}
#endif
#endif

从中可以找到native 方法对应的C函数定义,Java_com_example_hellojni_HelloJni_stringFromJNI

5. 定义对应的C函数,如Hello-jni 中定义

jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
 jobject thiz )
{
 return (*env)->NewStringUTF(env, "Hello from JNI1 !");
}

6. 下面就可以使用ndk-build编译C代码,编译成功后会在libs 目录下生成libhello-jni.so

7. 在Java代码中调入编译好的C动态库

static {
 System.loadLibrary("hello-jni");
 }

8. 编译运行,为了测试你的NDK例子的确成功运行,可以对Java_com_example_hellojni_HelloJni_stringFromJNI ,做点小改动 返回 “Hello world from JNI1 !。 注意要Clean Project,否则Eclipse可能不会重编译。




分享到:
评论

相关推荐

    Android NDK 开发教程三

    Android NDK 开发教程 三 Hello JNI 示例

    Android NDK 生成以及调用so 文件

    1.使用NDK来生成so文件: hello-jni.c 函数名Java +包名+函数名字 2.修改Android.mk文件 ... 您可能感兴趣的文章:android开发实践之ndk编译命令简单示例Android NDK开发简单程序分享(Hello Word!

    eclipse找不到java源码-EclipseAndroid_NDK_SDK:该存储库包含一个代表AndroidNDK+SDK混合项目的坚实

    NDK的安装和设置您应该能够编译并安装示例“ hellojni”应用程序 Eclipse for Java已安装 用于Android SDK开发的Eclipse ADT插件您应该能够编译并运行eclipse的hello-world项目 已安装Eclipse C ++插件“ CDT” ...

    Android应用开发揭秘pdf高清版

    最重要的是还全面介绍了如何利用原生的C,C++(NDK)和Python、Lua等脚本语言(AndroidScriptingEnvironment)来开发Android应用,《Android应用开发揭秘》实战性强,书中的每个知识点都有配精心设计的示例,尤为...

    Android代码-各种实例库

    博客:NDK-JNI实战教程(三) 从比Hello World稍复杂点儿的NDK例子说说模板 博客文章链接---------实例代码工程 博客:facebook Fresco框架库源使用基础 博客文章链接---------实例代码工程 博客:浅谈MVP实现...

    CSTR&Handle Java 客户端.rar

    文章介绍了Android NDK开发的简单概念、常见错误及处理和从第一个Hello World开始实际做一个简单的JNI开发示例,相信看完之后,大家对NDK开发有了一个概念上的认识了,那么接下来我们需要再深入一下NDK的开发,我们...

    Android博客来源:博客演示存储

    我的博客实例库( ##示例索引###博客:NDK-JNI实战教程(三)从比Hello World稍复杂点儿的NDK例子说说模板---------###博客:facebook Fresco框架库源使用基础---------###博客:浅谈MVP实现Android应用层开发------...

    NativeHello.zip

    Android NDK Native示例代码,通过该demo可以明确的学习JNI编程项目的入门创建方法 该压缩包中由两部分组成,NativeHello_static.zip及NativeHello_dynamic.zip组成 该示例代码非常简单,只实现在java层从C++ ...

    NativeHello_dynamic.zip

    Android NDK Native示例代码,通过该demo可以明确的学习JNI编程项目的创建方法, 此处使用动态注册实现java层函数与C++层函数之间的注册映射 该示例代码非常简单,只实现在java层从C++ native层获取一个key_code的值...

    AndroidGL2Player

    Hello GL2是一个Android C ++示例,它使用GLES 2.0 API绘制了一个三角形。 它使用JNI通过常规Android Java活动创建的在C ++中进行渲染。 本示例使用具有C ++支持的新。 先决条件 带有捆绑包的Android Studio 2.2 ...

Global site tag (gtag.js) - Google Analytics