Android 开发之 - NDK开发 Hello world!

第一个ndk程序 :

        这里完成的功能是 用java调用C代码 来实现输出一个HelloWorld~

需要下载ndk -- 百度 , 下载安装后解压即可;

新建一个AndroidProject,然后新建一个jni包。包下新建一个JniTest类。

结构如下:

开始JniTest文件中代码如下:

package com.somnus.androidtest.jni;

public class JniTest {

    public static native String helloWorldFromJNI();
}

布局文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.somnus.androidtest.MainActivity" >

    <TextView
        android:id="@+id/tv_hello_jni"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/tv_hello_jni"
        android:onClick="onAction"
        android:text="点击我调用JNI" />

</RelativeLayout>

Main文件代码:

package com.somnus.androidtest;

import com.somnus.androidtest.jni.JniTest;

import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {

    private TextView tv_hello_jni;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv_hello_jni = (TextView) findViewById(R.id.tv_hello_jni);
    }

    public void onAction(View v) {
        String mStr = JniTest.helloWorldFromJNI();
        tv_hello_jni.setText(mStr);
    }

}

***********************进入正题:***********************

开始得到我们的jni文件 ----> .c     .h 文件 以及.mk文件

1:开始生成我们的.h 文件。

步骤如下:

新建一个 launch configuration 左上角 图标 。 然后我这里命名为:AndroidNDKDemo

Location 中是jdk的javah.exe 路径;eg:  C:\Program Files\Java\jdk1.8.0_25\bin\javah.exe (这是我的jdk路径)

Working Drectory : ${project_loc}  从Variables中选择来

Arguments : -classpath ${project_loc}/bin/classes -d ${project_loc}/jni jni ${java_type_name}

注意在选项卡 Refresh中勾上Refresh resources upon completion

common中 选中 External Tools

最后Apply;

此时就看见目录下多了一个jni文件夹   ;jni目录下有一个xxx_xx_xxx_.h文件

这时 , 在.h 中就是我们的JniTest中的方法 。然后我们新建一个对应的.c文件   将.h中的方法复制到.c 文件中 并不齐括号 注意不要复制JNIEXPORT

此时我的.h文件为:

com_somnus_androidtest_jni_JniTest.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_somnus_androidtest_jni_JniTest */

#ifndef _Included_com_somnus_androidtest_jni_JniTest
#define _Included_com_somnus_androidtest_jni_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_somnus_androidtest_jni_JniTest
 * Method:    helloWorldFromJNI
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_somnus_androidtest_jni_JniTest_helloWorldFromJNI
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

com_somnus_androidtest_jni_JniTest.c

#include <jni.h>
#include <string.h>

jstring JNICALL Java_com_somnus_androidtest_jni_JniTest_helloWorldFromJNI(
JNIEnv *env, jobject mString) {
return (*env)->NewStringUTF(env, "HelloWorld! I am from JNI !");
}

新建Android.mk文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
#LOCAL_MODULE表示生成的库的名字,前面的lib和后缀名不用写
LOCAL_MODULE    := HelloWorld
LOCAL_SRC_FILES := com_somnus_androidtest_jni_JniTest.c

include $(BUILD_SHARED_LIBRARY)

现在我们就开始编译代码

打开JniTest.java

还是打开External Tools Configurations ..

在new一个文件 。 Loaction 为ndk-build.com 的路径 (下载NDK解压的目录下)

也要注意Refresh中和Common中的配置

好了Run 。。。。

你将会看到 libs中新增了一个armeabi文件夹 目录下多了一个libHellowWorld.so文件

最后的目录结构:

到现在我们在回到我们的JniTest文件中 , 写一个调用方法;如下

JniTest.java

package com.somnus.androidtest.jni;

public class JniTest {
    static{    //注意这里的名字: HelloWorld 是我们在mk文件中给定的名字 而不是libs下的so文件名
        System.loadLibrary("HelloWorld");
    }
    public static native String helloWorldFromJNI();
}

然后我们在运行 触发按钮 运行图:

ok! 到此结束~~

时间: 2024-11-07 20:31:47

Android 开发之 - NDK开发 Hello world!的相关文章

Android实战技巧之二十三:Android Studio的NDK开发

较新的NDK版本是r10b,Android Studio对NDK开发的支持还处于构思阶段,所以很多工作比如用javah生成头文件等工作还要自己做.今天用一个例子来演示AS中的NDK开发. 新建一个项目SecondNdkTest 在此项目中新建一个Module叫ndklibrary,作为so库单独划出来.在library中新建一个java类SecondLib,内容如下: package com.linc.ndklibrary; /** * Created by linc on 15-3-29. *

【Android开发】NDK开发(1)-Hello World!

上半年,公司的一个项目,本身我是不喜欢Android开发的,但是学习到的东西总需要整理一下. 从iOS转到Android,真心有些不习惯.就IDE来说,eclipse比Xcode差的不是一点半点.Android模拟器竟然还要开机!我勒个去.. 今天写个最简单的Android NDK的小栗子. 首先,什么是Android NDK? NDK 全称是:Native Development Kit,其他的,移步百度百科:android ndk_百度百科 1.新建一个Android Application

【Android开发】NDK开发(2)-jni数据类型

一.      Java数据类型与jni数据类型对应关系 基本数据类型 一维数组 Java类型 jni类型 Java类型 jni类型 void void boolean jboolean boolean[] jbooleanArray byte jbyte byte[] jbyteArray char jchar char[] jcharArray short jshort short[] jshortArray int jint int[] jintArray long jlong long[

【Android开发】NDK开发(3)-jni开发技巧

一.      jni打印调试信息 1.    在Android.mk文件中添加: LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog 2.     在 .c文件中添加: #include <android/log.h> 3.      打印log信息: __android_log_print(ANDROID_LOG_INFO, "INIT_GETGPSINFO", "get_gps_info"); //或者 __and

Android Studio配置NDK开发环境

1. 下载开发工具 下载CMake.LLDB.Android NDK,如图所示(勾选表示已经下载了,没勾选就勾选并点击右下角的apply进行下载,减号表示下载不完整或者有更新,再点击就可以勾选然后apply去下载或更新): CMake是编译器,类似于GCC.Clang等等.LLDB是用于调试的,类似于gdb的东西.Android NDK是Android Native Develop Kit,Android本地开发包,ndk开发必须的工具包,提供jni.h等等. 2. 最好配置一下 NDK_ROO

使用Android Studio进行ndk开发的准备

1. gradle-ex2. ndk开发包3. 项目目录结构4. lldb调试器 1. 一般来说gradle不是必需的,gradle也是可以进行ndk编译的,然而你需要在编译时使用更多(多于一个)c++编译选项时,以及让IDE可以使用lldb进行调试,或者是针对ndk开发和编译有更好的支持时,gradle-ex就是你所需要的.gradle-ex的ex不是扩展而是experimental实验非正式.它对ndk相关的配置进行了增强,同时又语法不兼容gradle,并且在ndk相关以外的配置沿着的是gr

Android Studio 使用NDK开发

Android Studio 使用NDK编程 使用Android Studio有半年多了,感觉很好用,不就感觉费劲的就是NDK的支持一直不是很好,再Bate版的时候好像0.4.x之前可以使用NDK,当然本身Android Studio本身是支持NDK编译的,下面我就来解释一下怎么使用Android Studio来编译. 很简单,首先要创建你的项目,创建完成之后点击项目右键new->Folder->JNI Folder,如图 然后就生成了jni文件夹 再往里面添加你的c/cpp文件和Androi

Android studio进行NDK开发

1.先在src/main/目录下新建jni目录 2.这里偷个懒,直接从其他工程中拷贝Android.mk,Application.mk,demo.cpp到jni目录下 在Application.mk文件中,配置如下: APP_ABI := armeabi armeabi-v7a arm64-v8a x86 x86_64 mips mips64 APP_PLATFORM := android-7 3.在local.properties文件中配置:ndk.dir=D\:\\android\\Andr

使用Android Studio进行NDK开发

Step1:创建native方法 很easy,仅仅须要给定义好的方法加上native关键词就可以 注意:由于该方法的详细实现是在c++中详细实现的.所以相似于接口方法不须要加{}. Step2:生成class文件(多数情况可忽略) 大多数情况下class文件是已经生成的.可是在刚进行改动或者代码中出现错误时,有可能会影响到class文件的生成,这时仅仅须要又一次生成一下就能够了.步骤为菜单条Build==>Make Project(若存在错误.修正后又一次尝试本操作就可以) Step3:生成.h