android : jave调用native c++

    技术2022-05-20  34

    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=JniTestPLATFORM=ANDROIDSRCPATH=.BINPATH=../cbinINCPATH=..LIBPATH=.

    INCPATH1=.INCPATH2=.INCPATH3=.

    ################ Build Specification ################

    CC=/cygdrive/e/WorkSpace/android/toolchain/bin/arm-linux-androideabi-gccCPPC=/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)/DebugRLSPATH:=$(BINPATH)DBGTARGET:=$(DBGPATH)/lib$(TARGET).soRLSTARGET:=$(RLSPATH)/lib$(TARGET).soDBGOBJ1:=$(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 rlspreall : 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 remountadb push libJniTest.so /system/lib

    11.在elipse环境中运行程序,可以看到效果.

    //另:so文件的打包方法: 可以把so文件们拷贝到本工程目录下的"lib"->"armeabi"目录下,在elipse下的package explorer下如果没有该目录则按F5刷新.这样编辑得到的apk文件就自动包含so了.

     


    最新回复(0)