华为荣耀v8连接电脑:Using NDK to Call C code from Android Apps
来源:百度文库 编辑:偶看新闻 时间:2024/04/28 14:52:19
Updated for NDK 1.6
While Android SDK is greatfor application development, every once in a while you may need accessto native code. This code is usually done in C. While you were able toaccess native code via Java Native Interface (JNI) all along, theprocess was rather hard. You would've typically had to compileeverything on your host computer for the target architecture, requiringyou to have the entire toolchain on your development machine.
AndroidNDK (Native Development Kit) simplifies working with native code. Itincludes the entire toolchain needed to build for your target platform(ARM). It is designed to help you create that shared library.
Note that native code accessible via JNI still runs insidethe Dalvik VM, and as such is subject to the same life-cycle rules thatany Android application lives by. The advantage of writing parts of yourapp code in native language is presumably speed in certain cases.
Note: I'm using
Overview
We are roughly going to do this:
1. Create the Java class representing the native code
2. Create the native code header file
3. Implement the native code by writing your C code
4. Compile everything and build you Shared Library
5. Use your native code inside Android activity
Create Native Library
This is just a Java file that lives in standard
/src/com.marakana/NativeLib.java
Code:
Create C Header File
In your project bin directory (in my case,
Next, create a jni directory in your project directory (in my case,
Next, copy the JNI header from
Here's my command line:
Code:
Write the C Code
In your
/NDKDemo/jni/com_marakana_NativeLib.h
Code:
And the corresponding implementation looks like this:
/NDKDemo/jni/ndk_demo.c
Code:
Build The Library
To build the library, first we need to create a makefile for how to compile the C code:
/NDKDemo/jni/Android.mk
Code:
Next, we need to tell NDK how to build the sharedlibrary and put it in the correct place inside the Eclipse project. Todo this, create a folder
/apps/ndk_demo/Application
Code:
Next, create a symbolic link
If you are on Windows, or another OS that doesn't support symbolic links, you may have to copy entire Eclipse project into
You can now to to your and run
The output should look lie this:
Code:
You can now refresh your Eclipse project and you should
Calling Native Code from Java
Sonow that we have the native C library implemented, compiled, and placedin the right place, let's see how we can call it from our Activity.It's actually rather simple - you just have to instantiate the instanceof your
/src/com.marakana/NDKDemo.java
Code:
The UI for this example is not that significant, but I'm going to include it here for the sake of completeness.
/res/layout/main.xml
Code:
Output
Source Code
http://marakana.com/static/tutorials/NDKDemo.zip
http://marakana.com/static/tutorials/NDKHOME.zip
While Android SDK is greatfor application development, every once in a while you may need accessto native code. This code is usually done in C. While you were able toaccess native code via Java Native Interface (JNI) all along, theprocess was rather hard. You would've typically had to compileeverything on your host computer for the target architecture, requiringyou to have the entire toolchain on your development machine.
AndroidNDK (Native Development Kit) simplifies working with native code. Itincludes the entire toolchain needed to build for your target platform(ARM). It is designed to help you create that shared library.
Note that native code accessible via JNI still runs insidethe Dalvik VM, and as such is subject to the same life-cycle rules thatany Android application lives by. The advantage of writing parts of yourapp code in native language is presumably speed in certain cases.
Note: I'm using
to refer to the root directory in which you installed your NDK. For me that's /Users/marko/WorkArea/android-ndk-1.6_r1
. I'm assuming all other directories and files are relative to your Eclipse project root, in my case /Users/marko/Workspace/Android/NDKDemo
.Overview
We are roughly going to do this:
1. Create the Java class representing the native code
2. Create the native code header file
3. Implement the native code by writing your C code
4. Compile everything and build you Shared Library
5. Use your native code inside Android activity
Create Native Library
This is just a Java file that lives in standard
src
directory in your Eclipse project. It serves as the glue to the native code that we'll write later./src/com.marakana/NativeLib.java
Code:
package com.marakana;
public class NativeLib {
static {
System.loadLibrary("ndk_demo");
}
/**
* Adds two integers, returning their sum
*/
public native int add( int v1, int v2 );
/**
* Returns Hello World string
*/
public native String hello();
}
Create C Header File
In your project bin directory (in my case,
/NDKDemo/bin
), run javah tool to create the JNI header file.Next, create a jni directory in your project directory (in my case,
/NDKDemo/jni
).Next, copy the JNI header from
/NDKDemo/bin
to /NDKDemo/jni
Here's my command line:
Code:
NDKDemo/bin$ javah -jni com.marakana.NativeLib
NDKDemo/bin$ mv com_marakana_NativeLib.h ../jni/
Write the C Code
In your
/NDKDemo/jni/
folder, create ndk_demo.c
file. This is where we'll implement the native code. To start, copy thefunction signatures from the header file, and provide theimplementation for those functions. In this example, the header filelooks like this:Code:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class com_marakana_NativeLib */
#ifndef _Included_com_marakana_NativeLib
#define _Included_com_marakana_NativeLib
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_marakana_NativeLib
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_marakana_NativeLib_add
(JNIEnv *, jobject, jint, jint);
/*
* Class: com_marakana_NativeLib
* Method: hello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_marakana_NativeLib_hello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
And the corresponding implementation looks like this:
Code:
#include "com_marakana_NativeLib.h"
JNIEXPORT jstring JNICALL Java_com_marakana_NativeLib_hello
(JNIEnv * env, jobject obj) {
return (*env)->NewStringUTF(env, "Hello World!");
}
JNIEXPORT jint JNICALL Java_com_marakana_NativeLib_add
(JNIEnv * env, jobject obj, jint value1, jint value2) {
return (value1 + value2);
}
Build The Library
To build the library, first we need to create a makefile for how to compile the C code:
Code:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := ndk_demo
LOCAL_SRC_FILES := ndk_demo.c
include $(BUILD_SHARED_LIBRARY)
Next, we need to tell NDK how to build the sharedlibrary and put it in the correct place inside the Eclipse project. Todo this, create a folder
/apps/ndk_demo/
and inside this folder create the Application file:Code:
APP_PROJECT_PATH := $(call my-dir)/project
APP_MODULES := ndk_demo
Next, create a symbolic link
/apps/ndk_demo/project
to your Eclipse project:ln -s ~/Workspace/Android/NDKDemo /apps/ndk_demo/project
If you are on Windows, or another OS that doesn't support symbolic links, you may have to copy entire Eclipse project into
/apps/ndk_demo/project
directory, then copy back to Eclipse. I'm running all this on Mac OS X 10.6 and I assume Linux-type shell.You can now to to your
make APP=ndk_demo
The output should look lie this:
Code:
android-ndk-1.5_r1$ make APP=ndk_demo
Android NDK: Building for application 'ndk_demo'
Compile thumb : ndk_demo <= sources/ndk_demo/ndk_demo.c
SharedLibrary : libndk_demo.so
Install : libndk_demo.so => apps/ndk_demo/project/libs/armeabi
You can now refresh your Eclipse project and you should
/lib/
directory containing your libndk_demo.so
file.Calling Native Code from Java
Sonow that we have the native C library implemented, compiled, and placedin the right place, let's see how we can call it from our Activity.It's actually rather simple - you just have to instantiate the instanceof your
NativeLib
class and from there on, it's just a regular Java object./src/com.marakana/NDKDemo.java
Code:
package com.marakana;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class NDKDemo extends Activity {
NativeLib nativeLib;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
nativeLib = new NativeLib();
String helloText = nativeLib.hello();
// Update the UI
TextView outText = (TextView) findViewById(R.id.textOut);
outText.setText(helloText);
// Setup the UI
Button buttonCalc = (Button) findViewById(R.id.buttonCalc);
buttonCalc.setOnClickListener(new OnClickListener() {
TextView result = (TextView) findViewById(R.id.result);
EditText value1 = (EditText) findViewById(R.id.value1);
EditText value2 = (EditText) findViewById(R.id.value2);
public void onClick(View v) {
int v1, v2, res = -1;
v1 = Integer.parseInt(value1.getText().toString());
v2 = Integer.parseInt(value2.getText().toString());
res = nativeLib.add(v1, v2);
result.setText(new Integer(res).toString());
}
});
}
}
The UI for this example is not that significant, but I'm going to include it here for the sake of completeness.
/res/layout/main.xml
Code:
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
android:layout_height="wrap_content" android:text="NDK Demo"
android:textSize="22sp" />
android:layout_height="wrap_content" android:id="@+id/textOut"
android:text="output">
android:layout_height="wrap_content" android:id="@+id/value1"
android:hint="Value 1">
android:layout_height="wrap_content" android:text="+"
android:textSize="36sp">
android:layout_height="wrap_content" android:id="@+id/value2"
android:hint="Value 2">
android:layout_height="wrap_content" android:text="result"
android:textSize="36sp" android:id="@+id/result">
Output
Source Code
http://marakana.com/static/tutorials/NDKDemo.zip
http://marakana.com/static/tutorials/NDKHOME.zip
帮帮忙啊: She () him a fool. A. dare not to B. dares not call C. don't dare call D. dare not call
Please call Alice ___ 345-6403. A. in B. at C. to D. of
Call to DllRegisterServer failed in "C:\WINDOWS\system32\flash.ocx"
to call someone'bluff
Integer需要引用什么(C#using)
c语言关键词using namespace的意思
c语言关键词using namespace意思
打电话给某人是call sb or call to sb?
call sb 与 call to sb的不同
I'll call you as soon as I ___. A,arrive B,reach C,get to D,get
I'll call you as soon as I ___. A,arrive B,reach C,get to D,get
Falied to update the system registry.Please try using regedit.
how to play "street fighter" using mouse?
Want to recruite here when the peiple are using baidu
Want to recruit here when the people are using baidu
using movies as an aid to learning language
Fatal error: Call to undefined function:cache_update
to call my own翻译中文是什么意思
it was nice of them to call
请问:easy-to-call-up是什么意思???
请问“index to call”怎样翻译
I tried to call you __ I heard from him,but you were not in.A,since B,that C,until D,as soon as
Tell Lily to call me as soon as she __.A,will arrive B,gets there C,has gone D,reach here
listen to deal with pass on call on depend on