136 lines
4.1 KiB
Plaintext
136 lines
4.1 KiB
Plaintext
Building native code applications and libraries
|
|
|
|
STEP 1
|
|
Building an application.
|
|
--------
|
|
|
|
0) set the environment variable PREBUILT to point to the Android prebuilt directory
|
|
export PREBUILT=<path_to_android_src>/prebuilt/<platform>
|
|
|
|
where you type in the actual path to the android source in place of <path_to_android_src>
|
|
and the platform you are using instead of <platform>: either linux-x86 or darwin-x86
|
|
|
|
1) Test the pndk install by building the hello world sample application:
|
|
|
|
cd <your_pndk_base>/samples/sample
|
|
make clean
|
|
make
|
|
|
|
The sample application uses hello.c to construct the hello binary, which you
|
|
can load and run on the ARM device. To achieve proper runtime behavior, verify
|
|
that:
|
|
* crtbegin_dynamic.o is the first linked object file
|
|
* crtend_android.o is last linked object.
|
|
Both are set by the config.mk file in pndk/config.
|
|
|
|
2) Test that this works correctly by attaching your ARM-based device to the USB
|
|
port and installing the application (hello) you just made by (in the commands
|
|
below # is the ARM device's shell prompt):
|
|
|
|
NOTE: need a development build so remount opens system permissions
|
|
|
|
adb remount
|
|
adb push hello system/app
|
|
adb shell
|
|
# cd system/app
|
|
# ./hello
|
|
Hello from the NDK; no user libraries.
|
|
# exit
|
|
|
|
3) You may also build the c++ binary hello_cpp.cpp into an application:
|
|
|
|
make -f Makefile.hello_cpp clean
|
|
make -f Makefile.hello_cpp hello_cpp
|
|
|
|
This uses the hello_cpp.cpp and hello_cpp.h files to construct the hello_cpp
|
|
binary application, which you can load and run on the ARM device. Note that
|
|
we do not provide for C++ exceptions thus you must use the -fno-exceptions flag
|
|
when compiling.
|
|
|
|
adb push hello_cpp system/app
|
|
adb shell
|
|
# cd system/app
|
|
# ./hello_cpp
|
|
C++ example printing message: Hello world!
|
|
# exit
|
|
|
|
|
|
STEP 2
|
|
Building and using a library
|
|
-------
|
|
|
|
Makefile.lib in pndk/sample shows how to make either a shared library or a
|
|
static library from the hellolibrary.c source. The example makes the libraries
|
|
libhello-shared.so and libhello-static.a .
|
|
|
|
Makefile.uselib then shows how to make an application that links against either
|
|
a shared or a static library. They examples shows how to build the two
|
|
applications use_hellolibrary-so and use-hellolibrary-a from the source
|
|
use_hellolibrary.c.
|
|
|
|
1) To make a shared library and an application that uses it:
|
|
|
|
make -f Makefile.lib clean
|
|
make -f Makefile.lib sharedlib
|
|
make -f Makefile.uselib clean
|
|
make -f Makefile.uselib use_hellolibrary-so
|
|
|
|
2) Copy the shared library libhello-shared.so to /system/lib (or the location
|
|
in which shared libraries are found by the kernel on your ARM-based device.)
|
|
|
|
adb push libhello-shared.so system/lib
|
|
|
|
You would not typically use the -shared or -static extensions in the filename,
|
|
but the distinction is important in the case where a static and shared library
|
|
are made in the same directory. Giving the files different names allows you to
|
|
override the link defaults that default to a static library of the same name.
|
|
|
|
3) The application, use_hellolibrary-so, can now be tested by loading and
|
|
running on the ARM device.
|
|
|
|
adb push use_hellolibrary-so /system/app
|
|
adb shell
|
|
# cd system/app
|
|
# ./use_hellolibrary-so
|
|
Library printing message: Hello from the NDK.
|
|
# exit
|
|
|
|
4) To make a static library:
|
|
|
|
make -f Makefile.lib clean
|
|
make -f Makefile.lib staticlib
|
|
make -f Makefile.uselib clean
|
|
make -f Makefile.uselib use_hellolibrary-a
|
|
|
|
5) Test the application use_hellolibrary-a by loading and running it on the ARM
|
|
device.
|
|
|
|
adb push use_hellolibrary-a system/app
|
|
adb shell
|
|
# cd system/app
|
|
# ./use_hellolibrary-a
|
|
Library printing message: Hello from the NDK.
|
|
# exit
|
|
|
|
|
|
SUMMARY:
|
|
---------
|
|
|
|
To make everything execute the following:
|
|
|
|
make clean
|
|
make
|
|
make -f Makefile.lib clean
|
|
make -f Makefile.lib
|
|
make -f Makefile.uselib clean
|
|
make -f Makefile.uselib
|
|
make -f Makefile.hello_cpp clean
|
|
make -f Makefile.hello_cpp hello_cpp
|
|
|
|
|
|
You should have:
|
|
* The libraries libhello-static.a and libhello-shared.so built, the latter
|
|
ready for installation,
|
|
* The applications hello, use_hellolibrary-a, and use_hellolibrary-so
|
|
available for installation on the ARM device.
|