Proper way to use 3rd party .so files in android - android

im stuck with this problem and dont know what im doing wrong. Please help me out.
Im working on an android project where I have to use 2 native library(.so) file. These 2 files are not generated by me, i just have to use them in my project.
I have placed these .so files under libs->armeabi folder. In the code i have used System.loadLibrary("name") inside a static block to load these library files. After doing this, i clean the project and run the application. I get the following error
java.lang.UnsatisfiedLinkError:
What am i missing. I have unchecked the first two options in build settings as well.
Note: I am not developing the native library. I am just using it. It was being used in a previous version, so I am pretty sure there is nothing wrong in the way the .so files have been generated.
PS: My ultimate requirement is like this,
My android application will have a jar which I am developing. The methods in the jar will make use of these native functions. The main application will not directly access the native functions. Should i place the .so files in the jar or should it be in the main application. How should i package the jar and .so files.
Please help me out, this is my first time using native functions and im totally lost. Links to any materials would be great. 

Set PATH to your NDK
Eclipse -> Window -> Preferences -> Android -> NDK -> set path to the NDK
Right click on an Android project and select Android Tools -> Add native support.
Make changes to your Android.mk file to include this .so file
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := <module_name>
LOCAL_SRC_FILES := <.so file name>
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../jni/include
include $(PREBUILT_SHARED_LIBRARY)
Clean project and build again

Related

How to add Android Studio created applications in android source code?

I have created an application in Android Studio. Now I want to add that project in android_source_code/packages/apps/ folder and build the entire AOSP image so that my app will be a system app.
Now the problem is the application is having a folder structure of Android Studio which is entirely different from Eclipse and android_source_code expects it to be in Eclipse folder structure format. So how can I achieve that?
Will android_source_code accepts the Studio folder structure or Do I need to write a script to transform the Studio folder structure to Eclipse format while copying to the android_source_code?
Any help will be appreciated.
Thanks
Integrating an Android Studio project into the AOSP build is not a trivial task. As far as I know, there aren't any dedicated tools to convert an Android Studio project (that is using the Gradle build system) to AOSP project (that is using the make build system).
One of the approaches you might want to investigate is creating your own Gradle task that will build the Android.mk file based on the source structure of you Android Studio project (i.e. finding all the relevant source sets for your JAVA files, resources, manifests, AIDLs etc ... and creating an Android.mk file that will tell the AOSP build system exactly wher to find each and every file).
This approach might work for relatively simple projects, but as soon as you start using more complex features (i.e. Modules, Manifest/Resources merging and so on), you will find it extremely difficult to generate the Android.mk without the help of the Gradle build system.
I would consider a different approach:
As a pre-installed privileged application, you can get the same privileges as a system application and perform whatever tasks you might wish to perform with no restrictions.
To do so, you can build your application using Android Studio, and define the already built APK as a BUILD_PREBUILT component that will be placed in the priv-app folder of the device.
Here is an exsample of the Android.mk file that will take your pre built APK and install it on the device as a pre installed application:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := your_app_name
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := .apk
LOCAL_PRIVILEGED_MODULE := true
LOCAL_CERTIFICATE := platform
include $(BUILD_PREBUILT)
In addition, depending on what your application needs to do, you might want to declare in your manifest that your application is a system app:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
...
...
android:sharedUserId="android.uid.system">

How do I include in my Eclipse project, native Android code located in a directory external to my project?

I have an android test project that includes JNI code from elsewhere in my repository. For instance, my Android.mk file resembles the following:
LOCAL_PATH := $(call my-dir)
include $(LOCAL_PATH)/../../../Android.mk
I have opened my project in eclipse, enabled native support, and switched to the Android Native perspective. The project builds and runs correctly.
My problem is that my native c++ code is not present in the eclipse workspace. I can't see it under the jni folder or under any of the project's sub folders. My question is, how do I include the native code in my workspace so that I can edit it, and set breakpoints (via Sequoyah)?
You can add a linked folder to your eclipse project, see http://www.russellbeattie.com/blog/1002305

how to set eclipse not delete some files during building

I configure ndk with eclipse in order to build my c++ code automatically. But i have two external .so file inside libs folder. Everytime, eclipse will delete these external .so file automatically when build project. Is it possible to tell eclipse not delete these external file.
The solution is here.
To summarize (and complement):
Copy your external (e.g., libexternal.so) library (or libraries) to another folder inside your 'jni' folder; for example 'myproject/jni/prebuilt'.
Add the following block to your existing 'jni/Android.mk' (one block for each external library):
include $(CLEAR_VARS)
LOCAL_MODULE := libexternal
LOCAL_SRC_FILES := prebuilt/libexternal.so
include $(PREBUILT_SHARED_LIBRARY)
Add 'libexternal' to 'APP_MODULES' in your existing 'jni/Application.mk'. 'APP_MODULES' should already list your JNI module (e.g., 'myjnimodule'):
APP_MODULES := libexternal myjnimodule
Confirm that the following block exists in 'jni/Application.mk'. Use the appropriate target architecture(s):
APP_ABI := armeabi-v7a
The result is that, as part of the invocation to 'ndk-build', the external library is copied to your 'myproject/libs/armeabi-v7a' folder.
The solution given by John Doedoe led me to another possibility, specific to Eclipse (tested on Mars 1 version):
Right click on your project in the project explorer.
Go into properties.
Go into "C/C++ Build".
Go into the "Builder Settings" tab.
Uncheck "Use default build command".
In the "Build command" text box type your target, e.g.: ndk-build APP_ABI="armeabi-v7a"
Apply / Ok
This will avoid changing behavior on a build machine for instance.

adding an external library in the Android CDT

I'm using the android ADT bundle for Linux with the CDT 8.0.2.+NDK support.
I need to add an external library. I checked on the Eclipse forum for example here:
linking-external-lib
The problem is that it looks like the Android CDT does not have the same settings. Neither of the three solutions can be applied.
Did anyone find the way to add an external .so library in eclipse with CDT?
Before I added the Native spport I used to have the .so file in the libs folder. Now the libs folder is cleared everytime I build the project. So I need to put it somewhere else.
I managed to do it by adding the following lines to the Android.mk
include $(CLEAR_VARS)
LOCAL_MODULE:=libname
LOCAL_SRC_FILES:= path-to-lib/libname.so
include $(PREBUILT_SHARED_LIBRARY)

NDK - How to use a generated .so library in another project

I have used ndk successfully to build & use a .so file in one project. I need to use this library in another project. I would rather not copy the source there, but just use the library.
Trying to copy & paste the whole libs/armeabi/libcommon.so to the project root does not work, I think because libs/armeabi is an android generated path.
So what would be the best way to do it?
I am using Eclipse-Galileo & ndk5.
There is a much simpler way to do all of this.
Let's say that your prebuilt library is called "libprebuilt.so"
In the project folder of the new project you want to only include the prebuilt library, do something like:
mkdir -p jni/libprebuilt
cp libprebuilt.so jni/libprebuilt
Then, just create a jni/libprebuilt/Android.mk file:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libprebuilt
LOCAL_SRC_FILES := libprebuilt.so
include $(PREBUILT_SHARED_LIBRARY)
Then when you do ndk-build, it will copy this library in to libs/armeabi/ ... that's all!
I figured out a way to do this, so posting it here in case someone else runs into it.
The code to be shared (including the Java JNI wrapper, native code, .so library), should be in a separate project. Convert this to a Library project by right-click on project name --> properties --> Android properties --> check mark "Is Library". This project cannot be executed now but can be referenced by other projects.
In the project which will use the shared object, add a reference to the Libarray project by right-click on project name --> properties --> Android properties --> Library/"Add". This should show up the Library project created in the previous step. Select it.
Now the .so can be referred to easily between different projects.
There is a package name inside all JNI (Java Native Interface) functions names (like JNIEXPORT void JNICALL Java_com_myapp_myclass_funct). So i guess you should rename these funkcions in library a recompile it. Or maybe use it as external package in your app.

Categories

Resources