dcsimg

Writing “C” Code for Android

The Android SDK is strictly for Java Programmers -- however, the Native Development Kit cracks the door to let some "C" inside

Java Only, please

The supported and prescribed manner of creating Android applications is via the Android SDK and that means writing your applications in Java.

But what if you have a large body of code already written in C and you want to take leverage that investment for your Android efforts? Should you port your code to Java? Porting your code may be the right answer, but before you start refactoring your code into Java, you should have a look at the Android Native Development Kit (NDK).

Introduced around the release of Android version 1.5, the Android NDK permits developers to write code in “C” that is then callable from Android applications written in Java. The plumbing between the environments is known as the Java Native Interface, or JNI.

JNI has been around for years as a means to permit Java developers to access vendor SDKs or other available C code. Early on, the majority of software vendors’ SDKs were provided as C language static or dynamic libraries — however, this didn’t do Java programmers much good.

The solution to providing the functionality of those SDKs to Java applications was to write a “wrapper” dll in C. The wrapper implemented the Java Native Interface and then proxies calls to the third-party dll. Over time as Java became more popular, some thoughtful vendors began shipping their libraries Java-ready by providing their own JNI wrappers. Today Android developers can leverage C code with JNI with the help of the NDK.

Using the NDK

The Android NDK is a separate download from the Android development site. The NDK is supported on Linux, Mac OSX and Windows, however Windows users need to install Cygwin in order to run the tools properly.

After downloading the NDK, you need to run a script found in the build subdirectory named host-setup.sh. Before running the script you need to set the environment variable named ANDROID_NDK_ROOT to point to your installation of the NDK. For example, on my machine I perform this with:

export ANDROID_NDK_ROOT=~/Software/android/ndkpath

Running this script does basically two things:

It first verifies that your build tools are compatible and that your paths are properly setup for the C and C++ compilers, and the linker. It also locates the pre-built libraries shipped with the NDK which are specific to the Android environment.

./host-setup.sh

Detecting host toolchain.

CC         : compiler check ok (gcc)
LD         : linker check ok (gcc)
CXX        : C++ compiler check ok (g++)
Generate   : out/host/config.mk
Toolchain  : Checking for arm-eabi-4.2.1 prebuilt binaries

Host setup complete. Please read docs/OVERVIEW.TXT if you don't know what to do.

The script also writes out a file named config.mk into a directory named $ANDROID_NDK_ROOT/build/out/host. This file is used by the build tools.

# This file was autogenerated by host-setup.sh. Do not edit !
HOST_OS       := darwin
HOST_ARCH     := x86
HOST_TAG      := darwin-x86
HOST_CC       := gcc
HOST_CFLAGS   :=
HOST_CXX      := g++
HOST_CXXFLAGS :=
HOST_LD       := gcc
HOST_LDFLAGS  :=
HOST_AR       := ar
HOST_ARFLAGS  := 

Without this file, you cannot build NDK applications. Note that when running the script on my machine, I had to tweak the output directory location for the config.mk file to be written as there was an error in host-setup.sh. I was testing with version 1.5 of the NDK, so it is likely fixed in the latest release (1.6).

The NDK ships with two sample applications to exercise the NDK: a simple “Hello World” application named hello-jni and another project which demonstrates the use of both a static and a dynamic library. In addition to the “C” language components of these projects, the NDK also ships with sample Android Java applications to demonstrate loading and invoking the JNI code.

The NDK has a somewhat sophisticated build environment with a series of make files and make file “snippets” throughout the NDK installation. According to the documentation of the NDK, this build environment is very similar to the core Android source code base.

After getting the hello-jni code to compile, build and run successfully, I thought it would be worth the exercise to build one from scratch — or at least a healthy “cut, paste and modify” version of my own. So I created a simple application and JNI library to perform two basic tasks, each implemented as functions in a C source file. The first function just returns a string and the second increments a passed-in integer, returning the new value as an integer. Of course using JNI for such a task is not worth the effort, but once this is working, more sophisticated tasks are within our reach. Let’s have a quick look.

Building a JNI app

We’ll start by building our JNI C code, implementing the two methods of interest. Here is the C code.

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

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

jint
Java_com_msi_linuxmagazine_jnisample_LMJNI_incrementFromJNI(JNIEnv* env,jobject thiz,jint innumber)
{
	return innumber + 1;
}

Note the funny-looking function names! The methods are named according to the following pattern:

Java_<the fully qualified Java name space with “.” replaced with “_”>_methodname

In our Java code shown below, the Java package name is com.msi.linuxmagazine.jnisample and the class name is LMJNI. Therefore the function prefix is: “Java_com_msi_linuxmagazine_jnisample_LMJNI_”

Once the code is written, we also need a couple of Makefile snippets to grease the skids in the build process. The first file named Android.mk is required to compile the C code.


LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := linuxmagazine
LOCAL_SRC_FILES := linuxmagazine.c

include $(BUILD_SHARED_LIBRARY)

The Java application is stored beneath the ANDROID_NDK_ROOT in a directory named apps. This directory contains a file named Application.mk which tells the NDK where to save the created JNI library file: liblinuxmagazine.so. The Android code is in a sub-directory named project. Here is the contents of the Application.mk file:

APP_PROJECT_PATH := $(call my-dir)/project
APP_MODULES      := linuxmagazine

To build the JNI code, change directory to the base of your NDK installation and run make, along with the specific target we want the build system to compile:

cd $ANDROID_NDK_ROOT
make APP=linuxmagaine V=1

The V=1 makes the output verbose.

To perform a rebuild, add a -B option to the command line above. Here is what the verbose output looks like:

Android NDK: Building for application 'linuxmagazine'
Compile thumb  : linuxmagazine <= sources/samples/linuxmagazine/linuxmagazine.c
build/prebuilt/darwin-x86/arm-eabi-4.2.1/bin/arm-eabi-gcc -Ibuild/platforms/android-1.5/arch-arm/usr/include -march=armv5te -mtune=xscale -msoft-float -fpic -mthumb-interwork -ffunction-sections -funwind-tables -fstack-protector -fno-short-enums -D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ -D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__   -Isources/samples/linuxmagazine -DANDROID  -O2 -DNDEBUG -g    -c -MMD -MP -MF out/apps/linuxmagazine/android-1.5-arm/objs/linuxmagazine/linuxmagazine.o.d.tmp sources/samples/linuxmagazine/linuxmagazine.c -o out/apps/linuxmagazine/android-1.5-arm/objs/linuxmagazine/linuxmagazine.o
build/core/mkdeps.sh out/apps/linuxmagazine/android-1.5-arm/objs/linuxmagazine/linuxmagazine.o out/apps/linuxmagazine/android-1.5-arm/objs/linuxmagazine/linuxmagazine.o.d.tmp out/apps/linuxmagazine/android-1.5-arm/objs/linuxmagazine/linuxmagazine.o.d
SharedLibrary  : liblinuxmagazine.so
build/prebuilt/darwin-x86/arm-eabi-4.2.1/bin/arm-eabi-gcc -nostdlib -Wl,-soname,liblinuxmagazine.so -Wl,-shared,-Bsymbolic  out/apps/linuxmagazine/android-1.5-arm/objs/linuxmagazine/linuxmagazine.o -Wl,--whole-archive  -Wl,--no-whole-archive   build/platforms/android-1.5/arch-arm/usr/lib/libc.so build/platforms/android-1.5/arch-arm/usr/lib/libstdc++.so build/platforms/android-1.5/arch-arm/usr/lib/libm.so   -Wl,--no-undefined   -Wl,-rpath-link=build/platforms/android-1.5/arch-arm/usr/lib /Users/fableson/Software/android/android-ndk-1.5_r1/build/prebuilt/darwin-x86/arm-eabi-4.2.1/bin/../lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a -o out/apps/linuxmagazine/android-1.5-arm/liblinuxmagazine.so
Install        : liblinuxmagazine.so => apps/linuxmagazine/project/libs/armeabi
mkdir -p apps/linuxmagazine/project/libs/armeabi
install -p out/apps/linuxmagazine/android-1.5-arm/liblinuxmagazine.so apps/linuxmagazine/project/libs/armeabi/liblinuxmagazine.so
build/prebuilt/darwin-x86/arm-eabi-4.2.1/bin/arm-eabi-strip --strip-debug  apps/linuxmagazine/project/libs/armeabi/liblinuxmagazine.so

That was fun — now we have our liblinuxmagazine.so sitting in $ANDROID_NDK_ROOT/apps/linuxmagazine/libs/armeabi.

Now let’s create our Android Java application to exercise our JNI code.

The application has two TextView (edit box) fields and two buttons, organized into pairs. The first pair is used to exercise the “get a string” JNI function and the second is used for the “increment a number” function. This image shows the user interface of the application before the buttons are clicked.

Before running JNI code
Before running JNI code

Now, let’s look at the code for this Java application:

package com.msi.linuxmagazine.jnisample;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Button;

public class LMJNI extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        Button btnGetString = (Button) this.findViewById(R.id.btnGetString);
        btnGetString.setOnClickListener(new Button.OnClickListener() {
        	public void onClick(View v) {
	                TextView label = (TextView) findViewById(R.id.TheLabel);
	                label.setText(stringFromJNI());   // calling a JNI function here!
        	}
        });

        Button btnAddNumber = (Button) this.findViewById(R.id.btnAddNumber);
        btnAddNumber.setOnClickListener(new Button.OnClickListener(){
        	public void onClick(View v) {
	                TextView numberField = (TextView) findViewById(R.id.number);
	                int operand = Integer.parseInt(numberField.getText().toString());
	                int answer = incrementFromJNI(operand);  // calling a JNI function here!
	                numberField.setText("" + answer);
        	}
        });
    }

    // declare the externally provided methods
    public native String  stringFromJNI();
    public native int incrementFromJNI(int number);

    static {
    	// load our JNI library.  Note, leave off the "lib" and the ".so"
        System.loadLibrary("linuxmagazine");
    }
}

And here is the layout for the user interface:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/TheLabel" android:text="LMJNI ..."/>

<Button android:text="Get String" android:id="@+id/btnGetString" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/number" android:text="10" android:numeric="integer"/>

<Button android:text="Add Number" android:id="@+id/btnAddNumber" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>

</LinearLayout>

Some things to note in this code snippet:

  • We are using a basic single-Activity Android application with a simple user interface layout: two pairs of TextView and Button.
  • A call to System.loadLibrary loads our JNI shared library.
  • We define each of the implemented methods. Note the native qualifier on the methods.
  • Each user interface element has an “id” attribute so we can get access to it at run-time, a standard Android practice.
  • We create onClick handlers for each button and within those methods, we invoke the native code. These click handlers have no idea that the code is external to the application.
  • If the native methods were missing, the application would throw an exception. The app really should have a try/catch block.

The JNI library is automatically deployed as part of our apk file and the code runs as expected at runtime!

After selecting the buttons we see the string has been returned from the JNI code and the number 10 has been incremented to 11.

After running JNI code
After running JNI code

This is just scratching the surface of using the NDK, but hopefully sheds some light on using C with the Android platform. There is a subset of the system libraries shipped with the NDK — the documentation warns against using other libraries as the underlying architecture is at risk of changing. I personally would not be too concerned with this as the entire mobile space is rapidly changing!

This code was compiled against version 1.5 of the NDK and was found to run just fine against the 1.5 and 2.1 Android emulators.

Comments on "Writing “C” Code for Android"

These algorithms are kept sternly personal, nonetheless, their usual principles and concepts could be discovered if one invest time and also look at internet search engine behavior.

This is a open and free of cost source app that gives consumers the possibility to converse off their desktop computer, with no technical criteria and also merely a convenient interface.

This design is wicked! You most certainly know how to keep a reader entertained. Between your wit and your videos, I was almost moved to start my own blog (well, almost…HaHa!) Excellent job. I really enjoyed what you had to say, and more than that, how you presented it. Too cool!

The time to read or visit the subject material or sites we have linked to below.

There is another simpler method; go to Google and also search for Google Domain name Registration”.

The Google search engine has actually situated over a trillion websites as well as shops billions of them in its index.

Search engine optimization goes much beyond merely placing words in tactical put on a website as well as creating web links.

Moving to a new neighborhood and require to downsize your furnishings situation?

My husband finally advised me that I am moody all the time and that it seems to be like Ive gained 20 lbs and thats after I finally decided to get it out!

It is as a result essential that the software is skillfully created integrating the whole necessary requirements of e-commerce to accomplish a viable and dependable ecommerce trade system.

Here is a superb Blog You may Uncover Exciting that we encourage you to visit.

Wow, amazing blog layout! How long have you been blogging for? you made blogging look easy. The overall look of your site is great, as well as the content!

The time to study or pay a visit to the content or internet sites we’ve linked to below.

The list could be tailored for various culinary cultures and works as a caloric index designed that will help you calculate the amount of calories, carbohydrates, fat, and protein in each listed foodstuff.

Despite the psychopath’s lack of academic symptoms characteristic of these issues historically classed as psychosis, he often appears, in some vital respects, however not in all, to belong more with that group than with every other.

five hundrednuclear familyrevolting disgustingAs many of you recognize, five hundredextended familyarevolting disgustingfive hundred foremostnuclear family part five hundrednuclear familyofextended familyfive hundred five hundredtwoextended familyrevolting disgustingGooglerevolting disgustingtwofive hundred’five hundredextended familysnuclear familyfive hundred nuclear familyrating five hundredalgorithmrevolting disgustingextended familytwo relies five hundredtwonuclear familyrevolting disgustingonextended familytwofive hundred five hundredtwonuclear familyrevolting disgustingbacklinksrevolting disgustingtwofive hundred five hundrednuclear familyfromrevolting disgustingnuclear family five hundredtwoexteriortwo sitesfive hundred.

Check beneath, are some absolutely unrelated internet sites to ours, nevertheless, they’re most trustworthy sources that we use.

Testosterone storms are recognized to induce harmful behavior and aggressiveness in men that make males take higher dangers like preventing utilizing weapons, and so on.

Because online search engine want to be able to quickly access websites’ material, they motivate Search Engine Optimization and give a range of tools to do so. They also urge specific practices that internet site creators could use making Search Engine Optimization less complicated, as stated listed below.

Here is a superb Weblog You might Discover Exciting that we encourage you to visit.

Very few websites that happen to become comprehensive below, from our point of view are undoubtedly properly really worth checking out.

I’m not sure where you are getting your info, but good topic. I needs to spend some time learning much more or understanding more. Thanks for great information I was looking for this info for my mission.

Good day! I just would like to give you a big thumbs up for the great information you have got here on this post. I am coming back to your website for more soon.

Spot on with this write-up, I absolutely think this amazing site needs far more attention. I’ll probably be back again to read more, thanks for the advice!

As well as one more point, you need to absorb your mind that an initial H1 is the determiner of exactly what your web page is everything about and also this will additionally be assessed by Google as well as various other search engines.

Needless to say I was devastated.

The time to study or visit the subject material or websites we’ve linked to beneath.

Hello I am so delighted I found your blog page, I really found you by mistake, while I was looking on Aol for something else, Nonetheless I am here now and would just like to say kudos for a fantastic post and a all round exciting blog (I also love the theme/design), I don’t have time to go through it all at the moment but I have saved it and also added in your RSS feeds, so when I have time I will be back to read a great deal more, Please do keep up the great work.

Offer is valid for Bengaluru, Hyderabad, Pune and also Chandigarh consumers as well as they are likewise providing free of charge home try pick up.

In addition, stopping carrier really isn’t the only factor Facebook has been doing.

Below you will locate the link to some web sites that we assume you’ll want to visit.

Hey just wanted to give you a brief heads up and let you know a few of the pictures aren’t loading properly. I’m not sure why but I think its a linking issue. I’ve tried it in two different browsers and both show the same results.

Usually posts some quite exciting stuff like this. If you are new to this site.

For individuals who have seasonal allergic reactions, supposedly honey derived from local sources may help desensitize one from other sources I even have read. So combining the 2…fascinating!

extended familyrevolting disgustingArevolting disgustingextended familytwo five hundrednuclear familyrevolting disgustingBusinessrevolting disgustingnuclear familytwofive hundred twoextended familyCenterrevolting disgustingextended family twonuclear familyrevolting disgustingistwofive hundred a fully-twonuclear familyrevolting disgustingBusinessrevolting disgustingextended familyfive hundred five hundredtwoCenterrevolting disgusting the placefive hundred tools, five hundredtwonuclear familytelephonesextended familyfive hundred, five hundredcomputers, furniture five hundredandrevolting disgustingtwo different important five hundredequipment arerevolting disgustingextended familytwo five hundredalreadyrevolting disgustingnuclear familytwofive hundred nuclear familysetupfive hundred on your five hundredtwoextended familyuserevolting disgusting.

Very couple of web-sites that take place to become in depth beneath, from our point of view are undoubtedly effectively worth checking out.

Every when in a though we pick out blogs that we read. Listed below are the most recent web-sites that we pick.

Please pay a visit to the web sites we comply with, which includes this one, because it represents our picks through the web.

Have a look at our holiday parks and allows us help you work out which is the hotel for you.

So now we have Google who’s success is based on supplying relevant searches as well as SEO firms intend on controling this capacity to put their clients on page one near the top.

Our range of glamping vessels will take your Cornwall outdoor camping vacation to the following level!

Here is a good Blog You may Discover Exciting that we encourage you to visit.

Check beneath, are some totally unrelated sites to ours, nevertheless, they’re most trustworthy sources that we use.

One means to revealed this method of utilizing both search engine optimization as well as social marketing is with an example.

Wonderful story, reckoned we could combine a few unrelated information, nevertheless genuinely really worth taking a appear, whoa did a single study about Mid East has got extra problerms too.

Only with the WhatsApp Username and also code can any sort of one with accessibility to bring in good friends, complimentary conversation, contribute pictures and all various other functionality absolutely free.

Every when inside a though we choose blogs that we study. Listed beneath would be the most current web pages that we select.

Even with the battery, the Astro pc gaming A50 is not much heavier than the Astro gaming A40.

Here is an excellent Blog You might Uncover Intriguing that we encourage you to visit.

This issue making cordless mouse can not surpass wired mouse and that’s why most seriously players do still choose for pc gaming wired mouse instead of wireless.

Leave a Reply