1. 启动Elipse,菜单: File->New->Android Project:
Project name : JniTest
Build Target : Android 2.2
Package name : jni.PN
Create Activeity : JniCA
->Finish
2. 修改main.xml,<TextView>元素增加属性 android:id="@+id/JNITest"
3.修改JniCA.java为:
package jni.PN;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class JniCA extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
String str = GetTest();
TextView JNITest = (TextView)findViewById(R.id.JNITest);
JNITest.setText(str);
}
static {
System.loadLibrary("JNITest");
}
public native String GetTest();
}
4.根据上面工程class文件,然后用javah工具生成c/c++头文件.
命令为: javah -classpath bin -d csrc jni.PN.JniCA
a)确保javah.exe所在的目录已经加入了系统PATH变量中
b)打开cmd.exe控制台,进入本工程所在的目录下,本机为:E:/WorkSpace/android/androidworkspace/JniTest
5.在工程目录的csrc目录下,建jni_PN_JniCA.cpp文件,内容如下:
#include "jni_PN_JniCA.h"
JNIEXPORT jstring JNICALL Java_jni_PN_JniCA_GetTest
(JNIEnv *env, jobject)
{
return env->NewStringUTF((char*)"JNITest Native String");
}
6.在工程目录的scrc目录下,建make文件,内容如下:(其中自己修改BINPATH, SRCPATH, CC, CPP的值)
################ Project Definition ################
TARGET=JniTest
PLATFORM=ANDROID
SRCPATH=.
BINPATH=../cbin
INCPATH=..
LIBPATH=.
INCPATH1=.
INCPATH2=.
INCPATH3=.
################ Build Specification ################
CC=/cygdrive/e/WorkSpace/android/toolchain/bin/arm-linux-androideabi-gcc
CPPC=/cygdrive/e/WorkSpace/android/toolchain/bin/arm-linux-androideabi-g++
LK=$(CPPC)
CCFLAG=-Wall -c -D "_LINUX" -D "$(PLATFORM)" -D "ENABLE_SPEED_TEST" -D "CGT_FACE_LIB"
LDFLAG=-lm -fPIC -shared -Wl,-s
INC=-I"$(SRCPATH)" -I"$(INCPATH)" -I"$(INCPATH1)" -I"$(INCPATH2)" -I"$(INCPATH3)"
DBGFLAG=$(CCFLAG) -D "_DEBUG" $(INC)
RLSFLAG=$(CCFLAG) -D "NDEBUG" $(INC) -O2
################ Process Sript ################
SRC1=$(wildcard $(SRCPATH)/*.c)
SRC2=$(wildcard $(SRCPATH)/*.cpp)
OBJ1=$(SRC1:.c=.o)
OBJ2=$(SRC2:.cpp=.o)
LIB=$(wildcard $(LIBPATH)/*.a)
DBGPATH:=$(BINPATH)/Debug
RLSPATH:=$(BINPATH)
DBGTARGET:=$(DBGPATH)/lib$(TARGET).so
RLSTARGET:=$(RLSPATH)/lib$(TARGET).so
DBGOBJ1:=$(addprefix ./Debug/, $(notdir $(OBJ1)))
DBGOBJ2:=$(addprefix ./Debug/, $(notdir $(OBJ2)))
RLSOBJ1:=$(addprefix ./Release/, $(notdir $(OBJ1)))
RLSOBJ2:=$(addprefix ./Release/, $(notdir $(OBJ2)))
DBGLIB:=$(filter %_d.a, $(LIB))
RLSLIB:=$(filter-out %_d.a, $(LIB))
.PHONY : all dbg rls dbgcln rlscln clean dbgpre rlspre
all : rls
clean: dbgcln rlscln
dbg: dbgpre dbgcln $(DBGTARGET)
rls: rlspre rlscln $(RLSTARGET)
dbgcln:
@echo "Clean for $(TARGET) - $(PLATFORM) Debug"
@rm -f $(DBGTARGET)
@rm -f $(DBGOBJ1)
@rm -f $(DBGOBJ2)
rlscln:
@echo "Clean for $(TARGET) - $(PLATFORM) Release"
@rm -f $(RLSTARGET)
@rm -f $(RLSOBJ1)
@rm -f $(RLSOBJ2)
dbgpre:
@echo ""
@echo "---------------- Building: $(TARGET) - $(PLATFORM) Debug ----------------"
@echo ""
@mkdir -p ./Debug
@mkdir -p $(DBGPATH)
rlspre:
@echo ""
@echo "---------------- Building: $(TARGET) - $(PLATFORM) Release ----------------"
@echo ""
@mkdir -p ./Release
@mkdir -p $(RLSPATH)
$(DBGTARGET) : $(DBGOBJ1) $(DBGOBJ2) $(DBGLIB)
@echo "Linking $(DBGTARGET)"
@$(LK) $(LDFLAG) -o $(DBGTARGET) $(DBGOBJ1) $(DBGOBJ2) $(DBGLIB)
$(DBGOBJ1) : ./Debug/%.o : $(SRCPATH)/%.c
@echo "C Compiling $<"
@$(CC) $(DBGFLAG) -o $@ $<
$(DBGOBJ2) : ./Debug/%.o : $(SRCPATH)/%.cpp
@echo "C++ Compiling $<"
@$(CPPC) $(DBGFLAG) -o $@ $<
$(RLSTARGET) : $(RLSOBJ1) $(RLSOBJ2) $(RLSLIB)
@echo "Linking $(RLSTARGET)"
@$(LK) $(LDFLAG) -o $(RLSTARGET) $(RLSOBJ1) $(RLSOBJ2) $(RLSLIB)
$(RLSOBJ1) : ./Release/%.o : $(SRCPATH)/%.c
@echo "C Compiling $<"
@$(CC) $(RLSFLAG) -o $@ $<
$(RLSOBJ2) : ./Release/%.o : $(SRCPATH)/%.cpp
@echo "C++ Compiling $<"
@$(CPPC) $(RLSFLAG) -o $@ $<
7.启动CygWin,进入本工程目录下的csrc目录下,执行命令: make,在cbin下面得到libJniTest.so
8.把android sdk目录下的adb.exe所在的路径加入系统PATH,本机路径为"E:/WorkSpace/android/android-sdk-windows/platform-tools"
9.新建模拟器(名字:and),调用下面命令启动模拟器
android-sdk-windows/tools>emulator.exe -avd and -partition-size 128
10.cmd下启动程序adb.exe,进入程序目录的cbin目录下,运行命令行:
adb remount
adb push libJniTest.so /system/lib
11.在elipse环境中运行程序,可以看到效果.
//
另:so文件的打包方法: 可以把so文件们拷贝到本工程目录下的"lib"->"armeabi"目录下,在elipse下的package explorer下如果没有该目录则按F5刷新.这样编辑得到的apk文件就自动包含so了.