2017-07-23 2 views
0

ich mit einigen Asset-Dateien meiner App in native C++ Code möchten, so habe ich einige Code-Tests wie folgt:fehlgeschlagen Assetmanager von Java zu c passieren ++ durch JNI

Java

package com.example.andy.textureviewtest; 
import ... 

public class MainActivity extends AppCompatActivity { 

    private AssetManager assetManager; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     TextView tv = (TextView) findViewById(R.id.sample_text); 
     tv.setText(stringFromJNI()); 
     assetManager = getAssets(); 
     generateAssets(assetManager); 
    } 

    public native String stringFromJNI(); 

    public native int generateAssets(AssetManager assetManager); 

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

C++

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

JNIEXPORT jstring JNICALL Java_com_example_andy_textureviewtest_MainActivity_stringFromJNI(
    JNIEnv* env, 
    jobject /* this */) { 
    std::string hello = "Hello from C++"; 
    return env->NewStringUTF(hello.c_str()); 
} 

JNIEXPORT jint JNICALL Java_com_example_andy_textureviewtest_MainActivity_generateAssets(
    JNIEnv* env,jobject thiz,jobject assetManager) { 
    AAssetManager* mgr = AAssetManager_fromJava(env, assetManager); 
    AAssetDir* assetDir = AAssetManager_openDir(mgr, ""); 
    const char* filename = (const char*)NULL; 
    while ((filename = AAssetDir_getNextFileName(assetDir)) != NULL) { 
    AAsset* asset = AAssetManager_open(mgr, filename, AASSET_MODE_UNKNOWN); 
    off_t bufferSize = AAsset_getLength(asset); 
} 
    return 0; 
} 

aber wenn meine app läuft, ich habe nur diesen Fehler:

java.lang.UnsatisfiedLinkError: No implementation found for int com.example.andy.textureviewtest.MainActivity.generateAssets(android.content.res.AssetManager) (tried Java_com_example_andy_textureviewtest_MainActivity_generateAssets and Java_com_example_andy_textureviewtest_MainActivity_generateAssets__Landroid_content_res_AssetManager_2) 

Irgendwas falsch hier, das ich verpasst haben könnte?

Antwort

1

Ihre C++ Funktionen wahrscheinlich fehlen

extern "C" 

Präfix. Ihre exportierten Namen werden vom C++ - Compiler fehlerhaft verarbeitet, und JNI kann sie nicht auflösen.

+0

Deshalb gibt es einen 'javah' Befehl, um richtige Header-Dateien zu erzeugen. –

+0

@AndrewHenle: einschließlich Header-Dateien ist nicht notwendig für JNI, aber es macht definitiv das Leben leichter. –

+0

extern "C" hinzufügen, bevor zwei native Funktionen immer noch den gleichen Fehler bekommen @ AlexCohn –