Step1:Open Android workspace in Eclipse.The workspace we create for the JNI development.Refer to this article How to install Android NDK on windows.
Step2:Create a new Android Project.Eclipse toolbar->New->Android Project.Create a new project directory in the Cygwin directory.
Clicking finish button. A new project in the workspace.
Step3:Manually create 2 directories in the project directory, JNI and libs.
Step4:Creating Andoird.mk file in the JNI directory.Android.mk is just a text file.
Android.mk file contents:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := first-jni LOCAL_SRC_FILES := first-jni.cpp include $(BUILD_SHARED_LIBRARY)Step5:Creating your jni C/C++ file in the JNI directory.Aftercompile the jni code successfully . There is a dynamatic link library(libfirst-jni.so) will be created in the libs directory we create manually before.
The jni code has two different type, C and C++.The difference is C++ file must export it's JNI function to C.
The code explains it self.
/*
* first-jni.c
*/
#include <string.h>
#include <jni.h>
jstring
Java_my_project_MyFirstJNI_MyFirstJNI_stringFromJNI( JNIEnv* env,
jobject thiz )
{
return (*env)->NewStringUTF(env, "My first JNI!");
}
<
/*
* first-jni.cpp
*/
#include <string.h>
#include <jni.h>
extern "C"
jstring
Java_my_project_MyFirstJNI_MyFirstJNI_stringFromJNI( JNIEnv* env,
jobject thiz )
{
return env->NewStringUTF("My first JNI!");
}
Step6:The JNI function name has rules.Refer to this link Naming_Functions.Java_{Package name Replace dot with underline}_{Class name}_{function name}() ,
In my example will be the "Java_my_project_MyFirstJNI_MyFirstJNI_stringFromJNI",
"my_project_MyFirstJNI" is the package name, "package my.project.MyFirstJNI;"
"MyFirstJNI" is my jni file class name.
"stringFromJNI" is the jni function name for JAVA to call.
Step7:Now we had create our own jni function.Press F5 to refresh the Eclipse.
Step8:Setup the Auto-build configuration, Please flow the steps in this article How to install Android NDK on windows. Starting from Step11.
Step9:Modify the JAVA code to call our JNI function.
package my.project.MyFirstJNI;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MyFirstJNI extends Activity
{
// Called when the activity is first created.
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText( stringFromJNI() );
setContentView(R.layout.main);
}
// A native method that is implemented by the
// 'first-jni' native library, which is packaged
// with this application.
//
public native String stringFromJNI();
// this is used to load the 'first-jni' library on application
// startup. The library has already been unpacked into
// /data/data/my.project.MyFirstJNI/libs/libfirst-jni.so at
// installation time by the package manager.
//
static
{
System.loadLibrary("first-jni");
}
}
Final Step:Run the project in emulator, the screen will show the string "My first JNI!".
Simple and nice... step by step... and up to date!
ReplyDeleteWish I had the time to compose such posts... :)
This is great help, thanks a ton.
ReplyDelete