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客户端没法调用需要的内核函数了。。。应该怎么样解决呢?