当前位置: 代码迷 >> Android >> JNI上调用NDK编译的C++库有关问题
  详细解决方案

JNI上调用NDK编译的C++库有关问题

热度:57   发布时间:2016-05-01 17:48:56.0
JNI下调用NDK编译的C++库问题
高分跪求大侠帮忙:
1 下面是我的JAVA工作路径和工程目录情况
TestCommon_Android(java workspace)
  .metadata(workspace config)
  TestBaseThread(project folder)
  assets(folder)
  bin(folder)
  gen(folder)
  jni(folder)
  Android.mk(belong to jni)
Application.mk(belong to jni)
com_Android_oray_TestBaseThread_TestBaseThread.cpp(belong to jni)
com_Android_oray_TestBaseThread_TestBaseThread.h(belong to jni)
stdafx.h(代码是从VC里移过来的,为防止编译报错加了个这个, (belong to jni))
TestThread.cpp(belong to jni)
TestThread.h(belong to jni) 
 libs(folder)
  armeabi(folder, belong to libs)
  libTestBaseThread_jni.so(armeabi下的,这个NDK编译生成的)
src

我的Android.mk :
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := TestBaseThread_jni
LOCAL_SRC_FILES := TestThread.cpp \
com_Android_oray_TestBaseThread_TestBaseThread.cpp \
./../../../../common/thread/BaseThread.cpp 


LOCAL_LDLIBS := -lm -llog
#LOCAL_CPPFLAGS := -D_STLP_USE_SIMPLE_NODE_ALLOC

LOCAL_C_INCLUDES += \
/cygdrive/e/Software/android.setup/android-ndk-r5-windows/android-ndk-r5/sources/cxx-stl/stlport/stlport \
$(JNI_H_INCLUDE)

include $(BUILD_SHARED_LIBRARY)


我的Application.mk:

# The ARMv7 is significanly faster due to the use of the hardware FPU
#APP_ABI := armeabi armeabi-v7a
APP_CPPFLAGS += -fexceptions
APP_STL := stlport_shared
APP_CPPFLAGS += -frtti


我的com_Android_oray_TestBaseThread_TestBaseThread.h
C/C++ code
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_Android_oray_TestBaseThread_TestBaseThread */#ifndef _Included_com_Android_oray_TestBaseThread_TestBaseThread#define _Included_com_Android_oray_TestBaseThread_TestBaseThread#ifdef __cplusplusextern "C" {#endif/* * Class:     com_Android_oray_TestBaseThread_TestBaseThread * Method:    testThread * Signature: ()V */JNIEXPORT void JNICALL Java_com_Android_oray_TestBaseThread_TestBaseThread_testThread  (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif


 我的com_Android_oray_TestBaseThread_TestBaseThread.cpp
C/C++ code
#include "TestThread.h"#include "com_Android_oray_TestBaseThread_TestBaseThread.h"#include <android/log.h>#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))#define JNIREG_CLASS "com/Android/oray/TestBaseThread/TestBaseThread"#define LOG_TAG "TestBaseThread"#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__)#ifdef __cplusplusextern "C" {#endif    /*    * Class:     com_Android_oray_TestBaseThread_TestBaseThread    * Method:    ThreadTest    * Signature: ()V    */JNIEXPORT void JNICALL Java_com_Android_oray_TestBaseThread_TestBaseThread_testThread  (JNIEnv *, jobject)    {        LOGE("jni OnLoad .............. \n");        CTestThread oMyTestThread;        oMyTestThread.Run();    }    /** * Table of methods associated with a single class. */     static JNINativeMethod gMethods[] =     {         { "ThreadTest", "()V", (void*)Java_com_Android_oray_TestBaseThread_TestBaseThread_testThread },    };     JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved)     {         jint r;         jclass k;         JNIEnv *env;         jint i, size = ARRAY_SIZE(gMethods);         r = vm->GetEnv((void **)&env, JNI_VERSION_1_4);        k = env->FindClass(JNIREG_CLASS); for (i = 0; i < size; i++)         {             r = env->RegisterNatives(k, &gMethods[i], i+1);         }         return JNI_VERSION_1_4;     } #ifdef __cplusplus}#endif
  相关解决方案