2012-07-02 30 views
1

我試圖運行CPP一個簡單的Android NDK的應用程序,但我得到的生成()函數UnsatisfiedLink錯誤。UnsatisfiedLinkError在Android應用(NDK)原生CPP功能

任何幫助,將不勝感激。我在C++上很流利,但是我的java有點生疏。我一直在嘗試從網絡上獲取關於命名的很多提示,但到目前爲止還沒有運氣。下面是我的文件:

native.cpp:

#include <string.h> 
#include <jni.h> 

jstring Java_com_optimuse_app_OptimuseAppActivity_generate(JNIEnv* env, jobject thiz){ 
    return env->NewStringUTF("Hello from JNI !"); 
} 

Android.mk:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := native 
LOCAL_SRC_FILES := native.cpp 

include $(BUILD_SHARED_LIBRARY) 

我NDK建造編譯這一點,一切順利的話,它爲我提供了一個libnative。所以,它位於項目目錄中。其餘的我用日食。

OptimuseAppActivity.java:

package com.optimuse.app; 
import android.app.Activity; 
import android.widget.TextView; 
import android.os.Bundle; 

public class OptimuseAppActivity extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     TextView tv = new TextView(this); 
     tv.setText(generate()); 
     setContentView(tv); 
    } 

    public native String generate(); 

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

而自動生成的AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.optimuse.app" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="15" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" android:hasCode="true"> 
     <activity 
      android:name="com.optimuse.app.OptimuseAppActivity" 
      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> 

感謝您的任何建議,現在一直在尋找了幾個小時!

+0

只是一些額外的調試,我已經嘗試:沒有generate()函數,應用程序工作正常。如果我將LoadLibrary文件更改爲另一個名稱,則會出現錯誤,所以我猜他加載的庫很好。我猜我的地方做了一個包/班/命名誤差作爲我不習慣去渣......已經彎曲我的頭了吧... – dorien

+0

您是否嘗試過把的System.loadLibrary類聲明的頂部? – Force

+0

看起來你可能在jni C api和C++ api之間存在差異。也許回過頭來看看hello-jni C示例,測試它,然後只做一個自定義包名或轉換爲C++的代碼,然後只執行一次。 –

回答

0

好極了!它的工作原理是這樣的:

extern "C" { 
    JNIEXPORT jstring JNICALL Java_com_optimuse_app_OptimuseAppActivity_generate(JNIEnv* env, jobject thiz) { 

     return env->NewStringUTF("Hello from JNI cpp!"); 
     //return (*env)->NewStringUTF(env, "Hello from JNI cpp!"); 

    } 
} 
8

你是最有可能運行到C++名字改編。例如,這裏是objdump的-T在圖書館當我建立給你好,jni.c:

00000c28 g DF .text 0000002c Java_com_example_hellojni_HelloJni_stringFromJNI 

和這裏的,如果我轉換成C++在你的方式我得到什麼:

00000c94 g DF .text 00000024 _Z48Java_com_example_hellojni_HelloJni_stringFromJNIP7_JNIEnvP8_jobject 

要防止的是混淆,使他們JNI可見,一個extern「C」 {}塊內聲明的原生功能,即

#include <string.h> 
#include <jni.h> 

extern "C" { 
    jstring Java_com_optimuse_app_OptimuseAppActivity_generate(JNIEnv* env, 
                   jobject thiz); 
} 

jstring Java_com_optimuse_app_OptimuseAppActivity_generate(JNIEnv* env, 
                  jobject thiz){ 
    return env->NewStringUTF("Hello from JNI !"); 
} 
+0

謝謝!我一直在找那個! – dorien

相關問題