首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > Android >

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

2012-08-03 
JNI下调用NDK编译的C++库问题高分跪求大侠帮忙:1 下面是我的JAVA工作路径和工程目录情况TestCommon_Androi

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 



我的JAVA测试代码:
Java code
package com.Android.oray.TestBaseThread;import android.app.Activity;import android.os.Bundle;public class TestBaseThread extends Activity {        static {        System.loadLibrary("TestBaseThread_jni");    }        native void testThread();        /** Called when the activity is first created. */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);                testThread();    }}


我的问题:
我用Eclipse debug调试启动后 有异常,但库(TestBaseThread_jni)已经加载过来了
01-06 02:26:35.908: WARN/dalvikvm(682): Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lcom/Android/oray/TestBaseThread/TestBaseThread;

01-06 02:26:44.005: WARN/dalvikvm(682): Class init failed in newInstance call (Lcom/Android/oray/TestBaseThread/TestBaseThread;)

如果正常的话,会在loge窗口里打出我C++代码里的"jni OnLoad .............. "才对,可为什么不行呢,跪求解决方法
 

[解决办法]
你看看 JNI下的findclass以及注册native方法是否都成功了。
UnsatisfiedLinkError 一般就是调用没有找到c实现的native函数出现的。
[解决办法]
我最近也在学习NDK;能问楼主一个问题吗????

我现在做一款跨平台移植的android棋牌网游,现在pc服务器和客户端已经完工,要移植到到android手机上;达到手机客户端与pc客户端(不只是服务器连接通信)正常通信,手机玩家能与pc玩家进行pk;但是,客户端的加密函数和解密函数都调用了window的内核里的东西,听说android是基于linux内核,那么这样android客户端没法调用需要的内核函数了。。。应该怎么样解决呢?


热点排行