Android ndk应用程序停止工作

时间:2014-07-01 18:32:27

标签: android-ndk

我一直在努力开始在我的Android应用程序中添加本机代码,所以我查看了大量的Android NDK教程都无济于事。我无法在我的模拟器或Galaxy S3上运行任何应用程序。我一直得到同样的错误:"不幸的是,[AppName]已停止工作" 我的ndk-build命令成功运行,我得到一个.so文件。我不知道.so文件应该是什么样的。这是我的

http://txt.do/klo0

对我来说这看起来很乱,但我知道什么?

这是我的logcat http://txt.do/klod 它说Native Method Not Found

我将以下代码作为我的主要(也是唯一的)活动

import android.app.Activity;
import android.os.Bundle;

public class NDKSetupActivity extends Activity {

static {
    System.loadLibrary("ndksetup");
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity);
    printLog("Hello!!");
}

private native void printLog(String logThis);
}

这是我的C代码(称为native.c)

#include <jni.h>
#include <string.h>
#include <android/log.h>

#define DEBUG_TAG "NDKSetupActivity"

void com_example_ndksetup_NDKSetupActivity_printLog(JNIEnv *env, jobject this, jstring logString)
{
jboolean isCopy;
const char * szLogString = (*env)->GetStringUTFChars(env, logString, &isCopy);

__android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "NDK: %s", szLogString);

(*env)->ReleaseStringUTFChars(env, logString, szLogString);
}

这是我的Android.mk文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_LDLIBS := -llog

LOCAL_MODULE    := ndksetup
LOCAL_SRC_FILES := native.c

include $(BUILD_SHARED_LIBRARY)

这是我的清单

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.ndksetup"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="19"
    android:targetSdkVersion="19" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".NDKSetupActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

</manifest>

2 个答案:

答案 0 :(得分:1)

您缺少 Java_ 前缀。尝试将native.c中的函数名称重命名为Java_com_example_ndksetup_NDKSetupActivity_printLog

希望这有帮助。

答案 1 :(得分:0)

对于正确的函数名称,有javah

cd bin/classes
javah com.company.MyClassWithNativeStuff com.company.Util

它生成.h文件。